gpt4 book ai didi

python - 如何使用 SQLObject 实现连接断开事件的回调?

转载 作者:太空宇宙 更新时间:2023-11-04 01:09:49 24 4
gpt4 key购买 nike

我正在使用一个 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

祝你好运

关于python - 如何使用 SQLObject 实现连接断开事件的回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28371396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com