10

我正在使用 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(会话/事务模式、不同的超时等),但无济于事。

4

1 回答 1

16

好的,我想我已经弄清楚了。问题在于 Django 和 Psycopg2 的长期问题。基本上,Psycopg2 会自动向数据库发出 BEGIN 语句。但是,如果 Django 认为没有发生数据修改,它不会在事务结束时发出 COMMIT。

这个问题有一些解决方案,请查看http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-application了解更多详细信息。理想情况下,您关闭自动提交(通过在数据库设置中设置 autocommit = True,尴尬的命名约定)。这可以防止只读函数以及写入函数的事务,因此您需要手动将这些函数包装在 @commit_on_success 装饰器中。

或者,只需将 django.middleware.transaction.TransactionMiddleware 添加到您的中间件类中。这会将每个请求包装在事务中。这也意味着在事务中不必要地包装只读请求,但这是一个快速而肮脏的解决方案。

于 2011-11-29T19:35:49.353 回答