我有一个使用 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% 是“空闲”的。
这是怎么发生的?此幽灵连接不允许执行正常查询。
错误:
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()
最佳答案
当我使用 Spring 事务管理时,我遇到了 Spring 的这个问题。 C3p0 连接处于空闲状态且未被重用,当达到总连接上限时,应用程序会出现数据库连接错误。
唯一对我有用的解决方案是定期强制终止 C3P0 连接 [C3P0 提供 htis 选项]。这是一个糟糕的解决方案,不推荐,除非它是我的唯一解决方案。
查看 htis url 上的 maxConnectionAge:http://www.mchange.com/projects/c3p0/#managing_pool_size
关于java - 无法 check out Spring DB 连接,但 300 个连接中有 290 个是 "IDLE",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19070022/