簡體   English   中英

如何使用SQLObject在連接斷開事件上實現回調?

[英]How to implement callback on connection drop event using SQLObject?

我使用的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]

這使我認為對於這種情況確實必須有一些回調,否則將不會寫入日志條目。 我將使用該回調建立與數據庫的新連接。 我一直找不到有關此的任何文檔。

有誰知道是否有可能實現該回調以及如何聲明它?

謝謝。

我們是SQLAlchemy常規用戶,而不是SQLObject 根據2010年發布的該線程( http://sourceforge.net/p/sqlobject/mailman/message/26460439),SQLObject不支持PostgreSQL的重新連接邏輯。 這是一個舊線程,但似乎沒有關於在SQLObject中解決此問題的任何討論。

我有三個建議的解決方案。

第一個解決方案是探索連接池。 當SQLObject檢測到psycopg2已斷開連接時,它可能提供一種打開新連接對象的方法。 我不能保證會這樣做,但是如果這樣做,則此解決方案將是您最好的選擇,因為它需要您進行最少的更改。

第二種解決方案是將后端從Postgres切換到MySQL。 SQLObject文檔提供有關如何使用mysql驅動程序的重新連接邏輯的信息-http: //sourceforge.net/p/mysql-python/feature-requests/9

第三種解決方案是切換為SQLAlchemy作為您的ORM,並使用其版本的連接池。 根據核心事件文檔,當使用池時,如果連接被刪除或關閉,則會打開一個新的連接-http: //docs.sqlalchemy.org/en/rel_0_9/core/exceptions.html#sqlalchemy.exc.DisconnectionError

祝你好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM