私は現在取り組んでいるチェリーピーアプリにpsycopg2を使用し、いくつかの操作を手動で処理するためにcliとphpgadminを使用しています。Pythonコードは次のとおりです。
#One connection per thread
cherrypy.thread_data.pgconn = psycopg2.connect("...")
...
#Later, an object is created by a thread :
class dbobj(object):
def __init__(self):
self.connection=cherrypy.thread_data.pgconn
self.curs=self.connection.cursor(cursor_factory=psycopg2.extras.DictCursor)
...
#Then,
try:
blabla
self.curs.execute(...)
self.connection.commit()
except:
self.connection.rollback()
lalala
...
#Finally, the destructor is called :
def __del__(self):
self.curs.close()
psycopg または postgres のいずれかに問題があります (ただし、後者の可能性が高いと思います)。いくつかのクエリを送信した後、接続が切断されます。同様に、phpgadmin (通常) も削除されます。何度かリクエストを行った後、再接続するように求められます。CLI のみが持続します。
問題は、これらが非常にランダムに発生し、原因が何であるかを追跡することさえできないことです. 数ページのリクエスト後にロックダウンされるか、数百ページのリクエスト後に実際に何も遭遇しないかのどちらかです。アプリを終了した後、postgres ログで見つけた唯一のエラーは次のとおりです。
...
LOG: unexpected EOF on client connection
LOG: could not send data to client: Broken pipe
LOG: unexpected EOF on client connection
...
新しい dbobj インスタンスが作成されるたびに新しい接続を作成することを考えましたが、これは絶対にしたくありません。
また、すべてのトランザクションがコミットされていない限り、同様の問題が発生する可能性があることを読みました: 私はすべての INSERT/UPDATE クエリに try/except ブロックを使用しますが、SELECT クエリには使用したことがなく、さらに書きたいとは思いません定型コード(ところで、コミットする必要がありますか?)。その場合でも、なぜ phpgadmin が終了するのでしょうか?
max_connections は .conf ファイルで 100 に設定されているため、それも理由ではないと思います。1 つの cherrypy ワーカーには 10 個のスレッドしかありません。
私が最初にどこを見ればいいのか、誰にも考えがありますか?