我正在使用PostgreSQL 9.1 / PostGIS 1.5,psycopg2 2.4.2和pgbouncer 1.4.2运行Django 1.3。
在与数据库的每个连接上,我都会在pgbouncer.log中获得一个日志条目:
2011-11-20 02:15:25.027 29538 LOG S-0x96c2200:app_db/postgres@192.168.171.185:5432因为:不洁服务器(年龄= 0)而关闭。
我无法找到解决这个问题的方法 - 任何人都知道为什么?我尝试过重新配置pgbouncer(会话/事务模式,不同的超时等),但无济于事。
答案 0 :(得分:16)
好的,我想我已经弄明白了。问题在于Django和Psycopg2长期存在的问题。基本上,Psycopg2会自动向DB发出BEGIN语句。但是,如果Django认为没有发生数据修改,它将不会在事务结束时发出COMMIT。
此问题有一些解决方案,请查看http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-application了解更多详情。理想情况下,您关闭自动提交(通过在数据库设置中设置autocommit = True,尴尬的命名约定)。这可以防止只读函数上的事务,也可以防止写函数上的事务,因此您需要在@commit_on_success装饰器中手动包装这些函数。
或者,只需将django.middleware.transaction.TransactionMiddleware添加到您的Middleware类。这将包装事务中的每个请求。这意味着在事务中也不必要地包装只读请求,但这是一个快速而肮脏的解决方案。