在pg_stat_activity中处于“空闲”状态的长时间持续的“COMMIT”查询

23

如果我查询:

select * from pg_stat_activity where application_name ~ 'example-application';

我收到了很多状态为idle且查询为COMMIT的行。它们持续时间很长,不会消失。经过一段时间,我的应用程序达到了hibernate.c3p0.max_size(连接池中最大的JDBC连接数)的限制,无法继续与数据库交互。

其他SO线程中描述了一些应用程序实现细节: Guice DAO提供程序在线程池中 - 查询变为“空闲事务”

为什么会发生这种情况?如何解决这个问题?


1
我相信连接池中的连接由于某种原因没有被重复使用。 - Vao Tsun
1个回答

34

如果会话处于"idle"状态,则"query"列显示连接执行的最后一条语句,而不是"当前"查询,因此连接不是等待提交完成。

query列仅在status显示active时显示当前语句。

"idle"连接不是问题,基本上这就是使用连接池的原因,以便可以重新使用它。但是,在"idle in transaction"状态下保持时间很长的会话一个问题。但您声明了您的连接处于"idle"状态。

如果连接池达到限制,则最可能的情况是您的应用程序没有正确地将连接返回到池中。这是您需要在应用程序中解决的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接