我有一个使用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()
答案 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()