pgbouncer - 关闭因为:每个连接上都有不洁净的服务器

Dic*_*ick 10 django postgresql psycopg2 pgbouncer

我正在使用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关闭因为:unclean server(age = 0).

我找不到任何解决这个问题的方法 - 任何人都知道为什么?我已经尝试重新配置pgbouncer(会话/事务模式,不同的超时等),但无济于事.

Dic*_*ick 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类中.这将包装事务中的每个请求.这意味着在事务中也不必要地包装只读请求,但这是一个快速而肮脏的解决方案.