10

PostgreSQL 9.1/PostGIS 1.5、psycopg2 2.4.2、および pgbouncer 1.4.2 で Django 1.3 を実行しています。

データベースに接続するたびに、pgbouncer.log にログ エントリが記録されます。

2011-11-20 02:15:25.027 29538 LOG S-0x96c2200: app_db/postgres@192.168.171.185:5432 終了理由: 汚れたサーバー (年齢 = 0)。

この問題の解決策が見つかりません。理由がわかる人はいますか? pgbouncer の再構成 (セッション/トランザクション モード、異なるタイムアウトなど) を試みましたが、役に立ちませんでした。

4

1 に答える 1

16

わかりました、私はこれを理解したと思います。問題は、Django と Psycopg2 の長年の問題にあります。基本的に、Psycopg2 は自動的に BEGIN ステートメントを DB に発行します。ただし、Django がデータ変更が発生していないと判断した場合、トランザクションの最後に COMMIT を発行しません。

この問題にはいくつかの解決策があります。詳細については、 http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-applicationを参照してください。理想的には、自動コミットをオフにします (DB 設定で autocommit = True を設定することにより、厄介な命名規則を使用します)。これにより、読み取り専用関数だけでなく書き込み関数でもトランザクションが防止されるため、これらの関数を @commit_on_success デコレーターで手動でラップする必要があります。

または、django.middleware.transaction.TransactionMiddleware をミドルウェア クラスに追加するだけです。これにより、トランザクション内のすべてのリクエストがラップされます。これは、トランザクションで読み取り専用リクエストを不必要にラップすることも意味しますが、これは手っ取り早い解決策です。

于 2011-11-29T19:35:49.353 に答える