10

SQLAlchemy を使用して MySQL データベースに対して実行するときに、クライアントからタイムアウトを制御する正しい方法は何ですか? connect_timeoutURL パラメータが不十分なようです。

データベースが実行されているマシンがネットワークから予期せず消えた場合などに、何が起こるかに興味があります。クエリ自体に時間がかかりすぎることは心配していません。

次のスクリプトは、ループに到達する前に一部のホストが利用できない場合に、予想されること (つまり、約 1 秒後にタイムアウト) を実行します。しかし、ループ中にホストがダウンした場合(たとえば、ループの開始後にネットワーク ケーブルを引っ張ってみてください)、タイムアウトには少なくとも 18 秒かかるようです。不足している追加の設定またはパラメーターはありますか?whilewhile

wait_timeoutサーバー側の変数だと思うので、セッション変数が機能しないことは驚くべきことではありません。でも念のために入れてみました。

from sqlalchemy import *
from sqlalchemy.exc import *
import time
import sys

engine = create_engine("mysql://user:password@somehost/test?connect_timeout=1")
try:
    engine.execute("set session wait_timeout = 1;")
    while True:
        t = time.time()
        print t
        engine.execute("show tables;")
except DBAPIError:
    pass
finally:
    print time.time() - t, "seconds to time out"
4

3 に答える 3

5

これは、TCP の仕組みにより不可能です。他のコンピュータがネットワークから切断された場合、着信パケットへの応答が停止するだけです。表示されている「18 秒」は、応答がないために TCP スタックがタイムアウトしたことを示しています。

目的の動作を実現する唯一の方法は、コンピューターが死ぬ直前に「i'm死にかけています」というメッセージを生成させることです。死が予期せぬものである場合、これは完全に不可能です。

ハートビートについて聞いたことがありますか?これらは、高可用性システムが 1 秒以下ごとに相互に送信して、他のシステムがまだ存在していることを知らせるパケットです。サーバーがなくなったことをアプリケーションに「すぐに」知らせたい場合は、最初に「即時」の長さ (1 秒、200 ミリ秒など) を決定し、それを検出するシステム (ハートビートなど) を設計する必要があります。もう一方のシステムは存在しません。

于 2009-08-28T19:42:05.510 に答える
1

まったく別のエラーが発生していると思います。これは恐ろしい「mysqlがなくなった」エラーです。私が正しければ、バグはドライバーのパッチであるため、新しいmysqldbドライバーに更新することです。

何らかの理由で更新できない/更新できない場合は、このためのSA修正を試す必要があります

db= create_engine('mysql://root@localhost/test', pool_recycle=True) 
于 2009-08-23T14:30:09.213 に答える
1

これは mysql/python コネクタのバグでしょうか? https://bugs.launchpad.net/myconnpy/+bug/328998 には、タイムアウトが 10 秒にハードコードされていると書かれています。

内訳がどこにあるかを実際に確認するには、パケット スニファーを使用して、サーバーとクライアント間の会話をチェックアウトします。このような場合には、wireshark + tcpdump が最適です。

于 2009-08-21T02:26:47.197 に答える