我正在运行 Django 1.3 和 PostgreSQL 9.1/PostGIS 1.5、psycopg2 2.4.2 和 pgbouncer 1.4.2。
在与数据库的每个连接上,我都会在 pgbouncer.log 中收到一条日志条目:
2011-11-20 02:15:25.027 29538 日志 S-0x96c2200: app_db/postgr[电子邮件受保护] /cdn-cgi/l/email-protection:5432 关闭,因为:服务器不干净(年龄=0)。
我找不到解决这个问题的方法 - 有人知道为什么吗?我尝试重新配置 pgbouncer (会话/事务模式、不同的超时等),但无济于事。
好吧,我想我已经弄清楚了。问题在于 Django 和 Psycopg2 长期存在的问题。基本上,Psycopg2 会自动向数据库发出 BEGIN 语句。但是,如果 Django 认为没有发生数据修改,则它不会在事务结束时发出 COMMIT。
这个问题有几个解决办法,看一下http://www.slideshare.net/OReillyOSCON/unwriting-your-django-application http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-application更多细节。理想情况下,您可以关闭自动提交(通过在数据库设置中设置 autocommit = True ,尴尬的命名约定)。这可以防止只读函数上的事务,也可以防止写入函数上的事务,因此您需要手动将这些函数包装在 @commit_on_success 装饰器中。
或者,只需将 django.middleware.transaction.TransactionMiddleware 添加到您的中间件类中。这会将每个请求包装在一个事务中。这也意味着不必要地将只读请求包装在事务中,但这是一个快速而肮脏的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)