使用django获取postgresql的“在事务中空闲”

时间:2012-06-01 13:31:59

标签: django postgresql

我们正在使用Django 1.3.1和Postgres 9.1

我有一个视图,它只触发多个选择以从数据库中获取数据。

在Django文档中提到,当请求完成时,如果在调用视图期间仅触发了select语句,则会发出ROLLBACK。但是,我在日志中看到很多“闲置在事务中”,特别是当我有超过200个请求时。我在postgres日志中没有看到任何提交或回滚语句。

可能是什么问题?我该如何处理这个问题?

2 个答案:

答案 0 :(得分:5)

首先,我会查看相关的帖子What does it mean when a PostgreSQL process is “idle in transaction”?,其中包含一些相关的内容。

“闲置交易”的一个原因可能是开发人员或系统管理员 进入了“开始”;在psql中忘了“提交”或“回滚”。 我去过那儿。 :)

但是,你提到你的问题与很多有关 并发连接。这听起来像调查“锁”尖端 从上面的帖子可能对你有所帮助。

还有一些建议:这个问题可能是次要问题。首要的 问题可能是200个连接比你的硬件更多 调整可以舒适地处理,所以一切都变得缓慢,当事情 变得越来越慢,有更多的事情在等待其他事情的完成。

如果您的网络应用程序前没有像Nginx这样的反向代理, 考虑加一个。它可以在同一主机上运行而无需额外的 硬件。反向代理将用于规范数量 连接到后端Django Web服务器,因而数量 数据库连接 - 我以前来过太多了 数据库连接,这就是我解决它的方法!

使用Apache的prefork模型,之间存在1 = 1的对应关系 Apache工作人员数量和数据库连接数量, 假设正在使用Apache :: DBI之类的东西。想象一下有人联系 通过慢速连接到Web服务器。 Web和数据库服务器 相对快速地处理请求,但请求是 在内容不必要的长时间内在Web服务器上保持打开状态 运回客户端。同时,数据库连接槽是 捆绑。

通过添加反向代理,后端服务器可以快速交付 repliy回到反向代理,然后释放后端工作者和 数据库插槽..然后反向代理负责获取 内容回到客户端,可能保持打开它自己的连接 更长时间。您可能有200个连接到前面的反向代理, 但是后端需要更少的工作人员和数据库插槽。

如果使用MRTG或类似图表绘制数据库插槽,您将看到有多少 你正在使用的插槽,并可以调低max_connections PostgreSQL,将这些资源用于其他事情。

您也可以查看pg_top 帮助监控数据库的功能。

答案 1 :(得分:0)

我知道这是一个较旧的问题,但本文可能会描述problem of idle transactions in django

基本上,Django的TransactionMiddleware如果没有标记为脏(通常由写入数据触发),则不会显式地委托事务。然而,即使它们是只读的,它仍然是所有查询的交易。因此,pg将等待查看是否还有更多命令,并且您将获得空闲事务。

链接文章显示了对事务中间件总是提交的一个小修改(基本上删除了检查事务是否为_dirty的条件)。我很快就会在生产环境中尝试这个修复。