首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SQLObject实现连接删除事件的回调?

如何使用SQLObject实现连接删除事件的回调?
EN

Stack Overflow用户
提问于 2015-02-06 17:27:38
回答 1查看 186关注 0票数 2

我使用了一个Python脚本,它对发送出去的邮件进行一定的流控制,主要是检查用户是否发送垃圾邮件。

该脚本通过SQLObject与数据库建立持久连接。在某些情况下,连接由第三方丢弃(例如,我们的防火墙由于空闲过多而关闭连接),而SQLObject没有注意到它已经关闭,它继续在死的TCP处理程序上发送查询,从而产生这样的日志条目:

代码语言:javascript
复制
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]

这使我认为,对于这种情况,确实必须有一些回调,否则日志条目将不会被写入。我会使用这个回调来建立到数据库的新连接。我一直没能找到的任何文档。

有人知道是否有可能实现这个回调,以及如何声明它?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-08 20:15:09

我们是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,并使用它们的连接池版本。根据核心事件文档,当使用池时,如果一个连接被删除或关闭,一个新的连接将被打开-- 9/core/exceptions.html#sqlalchemy.exc.DisconnectionError

祝你好运

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28371396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档