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

Joh*_*ohn 4 django postgresql

我们使用的是Django 1.3.1和Postgres 9.1

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

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

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

Mar*_*erg 5

首先,我会查看相关帖子当PostgreSQL进程"在事务中空闲"时,它意味着什么?其中涉及一些相关的领域.

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

但是,您提到您的问题与很多并发连接有关.这听起来像调查上面帖子中的"锁"提示可能对您有所帮助.

还有一些建议:这个问题可能是次要的.主要问题可能是200个连接比你的硬件和调整可以轻松处理,所以一切都变慢,当事情变得缓慢时,更多的事情等待其他事情完成.

如果您在Web应用程序前没有像Nginx这样的反向代理,请考虑添加一个.它可以在没有其他硬件的同一主机上运行.反向代理将用于管理后端Django Web服务器的连接数量,从而调节数据库连接的数量 - 我以前在这里有过多的数据库连接,这就是我解决它的方法!

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

通过添加反向代理,后端服务器可以快速将repliy传递回反向代理,然后释放后端工作器和数据库插槽.然后反向代理负责将内容返回给客户端,可能保持打开它自己的连接时间更长.您可能预先与反向代理建立了200个连接,但后端需要更少的工作人员和数据库插槽.

如果使用MRTG或类似方法绘制数据库插槽的图形,您将看到实际使用的插槽数,并可以调整PostgreSQL中的max_connections,从而将这些资源释放用于其他内容.

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