2

私は、送信メール メッセージに対して特定のフロー制御を行う Python スクリプトを使用しており、主にユーザーがスパムを送信しているかどうかをチェックしています。

このスクリプトは、 を介してデータベースとの永続的な接続を確立しますSQLObject。特定の状況下で、接続がサードパーティによってドロップされ (たとえば、過剰なアイドル状態のためにファイアウォールが接続を閉じる)、 は接続が閉じられたSQLObjectことに気付かず、無効な TCP ハンドラーでクエリを送信し続け、ログに記録されます。次のようなエントリ:

Feb 06 06:56:07 mailsrv2 flow: ERROR Processing request error: [Failure instance: Traceback: <class 'psycopg2.InterfaceError'>: connection already closed#012/usr/lib/python2.7/threading.py:524:__bootstrap#012/usr/lib/python2.7/threading.py:551:__bootstrap_inner#012/usr/lib/python2.7/threading.py:504:run#012--- <exception caught here>---#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/twisted/python/threadpool.py:191:_worker#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/twisted/python/context.py:118:callWithContext#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/twisted/python/context.py:81:callWithContext#012
/opt/scripts/flow/server.py:91:check#012
/opt/scripts/flow/flow.py:252:check#012
/opt/scripts/flow/flow.py:155:append_to_log#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/main.py:1226:__init__#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/main.py:1274:_create#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/main.py:1298:_SO_finishCreate#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/dbconnection.py:468:queryInsertID#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/dbconnection.py:327:_runWithConnection#012
/opt/scripts/virtualenv/local/lib/python2.7/site-packages/SQLObject-1.3.1-py2.7.egg/sqlobject/postgres/pgconnection.py:191:_queryInsertID#012]

これは、実際にこの種の状況に対して何らかのコールバックが必要であると私に思わせます。そうしないと、そのログエントリは書き込まれません。そのコールバックを使用して、データベースへの新しい接続を確立します。それに関するドキュメントを見つけることができませんでした

そのコールバックを実装することさえ可能かどうか、またそれを宣言する方法を知っている人はいますか?

ありがとう。

4

1 に答える 1

3

SQLAlchemy私たちはよりも を定期的に使用していますSQLObject。2010 年のこのスレッド ( http://sourceforge.net/p/sqlobject/mailman/message/26460439 ) によると、SQLObject は PostgreSQL の再接続ロジックをサポートしていません。これは古いスレッドですが、SQLObject 内からこれを解決することについての議論はないようです。

私が提案する解決策は3つあります。

最初の解決策は、接続プールを調査することです。psycopg2 が切断されたことを SQLObject が検出したときに、新しい接続オブジェクトを開く方法を提供する場合があります。私はそれを保証することはできませんが、そうする場合、このソリューションはあなたの側での変更が最小限で済むため、最善の方法です.

2 番目の解決策は、バックエンドを Postgres から MySQL に切り替えることです。SQLObject ドキュメントは、mysql ドライバーの再接続ロジックの使用方法に関する情報を提供します - http://sourceforge.net/p/mysql-python/feature-requests/9

3 番目の解決策は、ORM として SQLAlchemy に切り替え、そのバージョンの接続プールを使用することです。コアイベントのドキュメントによると、プールを使用すると、接続がドロップまたは閉じられた場合に新しい接続が開かれます -- http://docs.sqlalchemy.org/en/rel_0_9/core/exceptions.html#sqlalchemy.exc.DisconnectionError

幸運を祈ります

于 2015-02-08T20:15:09.650 に答える