43

1時間オンラインでハングする可能性のあるデータベース接続を開くPythonアプリケーションがありますが、データベースサーバーが再起動することがあり、Pythonがまだ接続している間は、OperationalError例外なく機能しません。

したがって、データベースに「ping」を実行するための信頼できる方法を探しており、接続が有効であることを確認しています。psycopg2のドキュメントを確認しましたが、そのようなものは見つかりません。確かに、のような単純なSQLステートメントを発行して例外をキャッチすることはできますが、 PHPpg_connection_statusSELECT 1のようなネイティブメソッドがあることを願っています。

ありがとう。

4

4 に答える 4

25

pg_connection_statusPQstatus を使用して実装されます。psycopg はその API を公開していないため、チェックは利用できません。psycopg が PQstatus 自体を呼び出す唯一の場所は、新しい接続が確立されたときと、実行の開始時です。はい、簡単な SQL ステートメントを発行して、接続がまだ存在するかどうかを確認する必要があります。

于 2009-08-15T14:36:08.980 に答える
16

connection.closedサーバーによって閉じられた/切断された接続は反映されません。を使用してクライアントによって閉じられた接続のみを示しますconnection.close()

接続がまだ有効であることを確認するには、プロパティを読み取りますconnection.isolation_level。これにより、接続が切断された場合に pgcode == "57P01" で OperationalError が発生します。

SELECT 1これにより、データベースへのラウンドトリップのレイテンシが少し追加されますが、または同様のものよりも望ましいはずです。

import psycopg2
dsn = "dbname=postgres"
conn = psycopg2.connect(dsn)

# ... some time elapses, e.g. connection within a connection pool

try:
    connection.isolation_level
except OperationalError as oe:
    conn = psycopg2.connect(dsn)

c = conn.cursor()
c.execute("SELECT 1")
于 2013-11-20T08:39:32.687 に答える