java - 无法 check out Spring DB 连接,但 300 个连接中有 290 个是 "IDLE"

标签 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% 是“空闲”的。

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

错误:

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/

相关文章:

java - 使用 SQL 加载器批量插入数据

java - 请求的资源上不存在 'Access-Control-Allow-Origin' header 。错误

spring - 为什么在 Spring Boot 2.2.4 中没有加载 restTemplateBuilder?

java - 在 Hibernate 中重用查询

hibernate - Hibernate/JPA 中的@OrderColumn 导致冗余的 UPDATE SQL 语句

java - 我该如何将 Ctrl+Click 包含为右键单击? ( java )

Java:如何在注释处理器和另一个项目之间进行通信?

java - 有没有办法将分离的对象传递给 JPA 持久化? (分离的实体传递给持久化)

java - 如何在android中的textview中添加滚动条

java - Spring Security 使用 RequestParam 时不断要求登录