1

我有一个使用 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”。

它是怎么发生的?这种幽灵连接不允许执行正常查询。

错误:

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()
4

2 回答 2

1

连接不会返回到池中。造成这种情况的一个常见原因是使用 getSession()。要么依赖线程绑定的 Session,要么将其与 releaseSession() 结合使用。

一般来说,推荐使用HibernateTemplate:getHibernateTemplate()

于 2013-09-29T13:20:03.940 回答
1

当我使用 Spring 事务管理时,我遇到了 Spring 的这个问题。C3p0 连接处于空闲状态,没有被重用,当达到总连接上限时,应用程序给出了 db 连接错误。

唯一对我有用的解决方案是定期强制终止 C3P0 连接 [C3P0 提供 htis 选项]。这是一个糟糕的解决方案,除非它是我的唯一解决方案,否则不推荐。

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

于 2013-09-28T18:06:23.103 回答