JDBC连接池:DB重启后连接不回收

Posted

技术标签:

【中文标题】JDBC连接池:DB重启后连接不回收【英文标题】:JDBC Connection Pool: connections are not recycled after DB restart 【发布时间】:2015-12-23 22:19:57 【问题描述】:

我在org.apache.tomcat.jdbc.pool.PoolProperties 上添加了setMaxActive(8)。每次数据库重新启动时,应用程序都无法使用,因为已建立的连接仍然存在。我收到以下错误:

org.postgresql.util.PSQLException: 此连接已关闭

我已经尝试在池中使用其他一些设置,但无济于事......

感谢您的帮助!

【问题讨论】:

捕获该异常并在池中重新创建连接 【参考方案1】:

使用validationQuery 属性将在返回连接之前检查连接是否有效。

参考:Tomcat 6 JDBC Connection Pool

此属性在最新的 tomcat 版本中可用。

【讨论】:

【参考方案2】:

看看这个链接:

Postgres connection has been closed error in Spring Boot

非常有效的问题,这个问题通常是许多人面临的。这 异常通常发生,当网络连接丢失之间 池和数据库(大部分时间由于重新启动)。看着 您指定的堆栈跟踪,很明显您正在使用 jdbc 池来获取连接。 JDBC 池具有微调选项 各种连接池设置和有关正在发生的事情的日志详细信息 池内。

可以参考详细的Apache documentation关于pool 指定放弃超时的配置

Check for removeAbandoned, removeAbandonedTimeout, logAbandoned parameters

此外,您还可以利用其他属性来进一步 加强验证

Use testXXX and validationQuery for connection validity.

我自己的$0.02:使用这两个参数:

validationQuery=<TEST SQL>
testOnBorrow=true

【讨论】:

谢谢,我试过用removeAbandoned,没用,我试试validationQuery和testOnBorrow。

以上是关于JDBC连接池:DB重启后连接不回收的主要内容,如果未能解决你的问题,请参考以下文章

Druid 连接池,重启Mysql数据库后,Druid会自动重新连接不,该在哪配置?

JDBC07:数据库连接池

DBCP,C3P0与Tomcat jdbc pool 连接池的比较

JDBC数据库的连接池

JDBC之Druid连接池的使用

weblogic连接池