如果我查询:
select * from pg_stat_activity where application_name ~ 'example-application';
我得到许多行,状态为idle,查询为COMMIT。它们是持久的,不会消失。一段时间后,我的应用程序达到hibernate.c3p0.max_size(池中最大JDBC连接数)限制,并停止使用数据库。
idle
COMMIT
hibernate.c3p0.max_size
其他SO线程中描述了一些应用程序实现的详细信息: 线程池中的Guice DAO Provider- 查询变为“空闲时转换”
为什么会发生?如何解决这个问题呢?
如果会话为“空闲”,则查询列将显示连接已执行的 最后一条 语句。它 不是 “当前”查询,因此连接 不 等待提交完成。
如果显示,则该query列仅显示 当前 语句。status``active
query
status``active
“空闲”连接 不是问题 ,实质上是使用连接池的原因,以便可以重新使用它。但是,在“空闲状态” 中 停留很长时间的会话 是 一个问题。但是您说您的连接处于“空闲”状态。
如果您的连接池达到限制,则很可能意味着您的应用程序没有将连接正确返回到该池。您需要在应用程序中对其进行修复。