2009-05-15 10 views
0

私はデータベースとの接続を確立したPythonでコードを書いています。私はループでクエリを持っています。ループでクエリが実行されている間に、ネットワークケーブルを抜いた場合、例外が発生して停止する必要があります。しかし、これは起こりません.2分後にもう一度ネットワークキャビネットを接続すると、終了した場所から再び開始されます。私はlinuxとpsycopg2を使用しています。例外が表示されないPythonでのdb接続

+0

コードを表示しますか? –

+1

「緊急の助けが必要です」と叫ぶことは、おそらく同情を得る最良の方法ではありません。 – bortzmeyer

答えて

2

データベース接続は、ほぼ確実にTCPソケットに基づいています。 TCPソケットは失敗する前に長時間リトライしていますが、(Pythonで)例外が発生します。言うまでもなく、データベース層で再試行/自動再接続を試みることはありません。

2

ダグラスの答えによると、TCPのために例外は発生しません。

socket.setdefaulttimeout()を使用して、より短いタイムアウト値を設定できます。データベース接続は、例えば、Pythonのソケットでネイティブソケットを構築されていない場合

setdefaulttimeout(...)は

setdefaulttimeout(timeout) 

    Set the default timeout in floating seconds for new socket objects. 
    A value of None indicates that new socket objects have no timeout. 
    When the socket module is first imported, the default is None. 

しかし、それは動作しない場合があります。

1

クライアントライブラリがサーバーにどのように接続していても機能するタイムアウトを実装する場合は、DB操作を別のスレッドで実行するか、別の処理として実行するのが最善です/ processは必要に応じてkillすることができます。 Python 2.6標準ライブラリのマルチプロセッシングモジュールを参照してください(必要に応じて、バックポートバージョン2.5があります)。プロセスを削除すると、オペレーティングシステムがリソースの割り当てを解除してクリーンアップすることになりますが、スレッドを強制終了することは、常に安全でないばかげたビジネスであるため、プロセスはより優れています。

+0

詳細は – ha22109

+0

を参照してください。http://docs.python.org/library/multiprocessing.htmlで始まり​​ます。標準ライブラリ(2.6以降のPython; 2.5を使用している場合はマルチプロセッシングモジュールを使用する方法を説明しています) code.google.com/p/python-multiprocessing/からバックポートをインストールします)。多くの詳細を記述するためのスペースはあまりありませんが、2つのキューをquinとquoutにし、QueueでProcessを作成し、SQLクエリを必要とするときにquinにプッシュします。プロセスはそのQueueで待機し、クエスチョンを引き出し、結果をクワウトでプッシュします。要求プロセスは時間がかかり過ぎると他のプロセスを強制終了します。 –