无法检查Spring DB连接,但300个连接中有290个是“IDLE”

时间:2013-09-28 17:59:53

标签: java spring hibernate postgresql

我有一个使用Hibernate 4.1.1和Spring 3.1.1以及Postgres 9.2的Web应用程序。我还使用spring transaction api和c3p0连接池。数据库服务器位于另一台服务器上,没有安装pgbouncer,只安装了Postgres。

我在日志中有很多错误,无法检查数据库连接。但是当我在Postgres服务器上查看状态时(“SELECT datname,procpid,current_query FROM pg_stat_activity”),95%的连接都是“IDLE”。

怎么回事?这种ghost连接不允许执行普通查询。

错误:

Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@4bbf8a41 -- timeout at awaitAvailable()

2 个答案:

答案 0 :(得分:1)

当我使用Spring Transaction管理时,我遇到了Spring的这个问题。 C3p0连接处于空闲状态且未被重用,当达到总连接上限时,应用程序给出了数据库连接错误。

只有对我有用的解决方案是在定期间隔后强行杀死C3P0连接[C3P0提供htis选项]。它是一个糟糕的解决方案,不推荐,除非它是我的唯一解决方案。

在htis url上查看maxConnectionAge:http://www.mchange.com/projects/c3p0/#managing_pool_size

答案 1 :(得分:1)

连接不会返回到池中。常见的原因是使用getSession()。 要么依赖于线程绑定的Session,要么将它与releaseSession()结合使用。

一般情况下,建议使用HibernateTemplate:getHibernateTemplate()