django - pgbouncer - 关闭因为 : unclean server on every connection

标签 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 closing because: unclean server (age=0).

我找不到这个问题的任何解决方案 - 有人知道为什么吗?我试过重新配置 pgbouncer( session /事务模式、不同的超时等),但无济于事。

最佳答案

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

这个问题有几个解决办法,看http://www.slideshare.net/OReillyOSCON/unbreaking-your-django-application更多细节。理想情况下,您关闭自动提交(通过在您的数据库设置中设置 autocommit = True,笨拙的命名约定)。这可以防止只读函数上的事务,也可以防止写函数上的事务,因此您需要手动将这些函数包装在 @commit_on_success 装饰器中。

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

关于django - pgbouncer - 关闭因为 : unclean server on every connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8198990/

相关文章:

jython 上的 django(无法导入名称 BaseDatabaseWrapper)

django - 从Docker连接Postgres

python - 使用 SQLAlchemy 和 Mapped 创建表时指定时间戳列类型提示

python - 小写django查询

python - Django mysql 查询仅返回第一列

python 在 django 下找不到库,否则会找到

python - 如何使 Python 请求包的响应成为 "file-like object"

ruby-on-rails - Ruby & Rails - 使用 CSV 中的关联播种数据

javascript - 捕获sequelize模型中的错误

python - 返回字典时的光标并打印键在哪里