已解决:connection holder is null问题。

错误信息

Caused by: java.sql.SQLException: connection holder is null
at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.java:1085)
at com.alibaba.druid.pool.DruidPooledConnection.getMetaData(DruidPooledConnection.java:825)
at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:285)
... 70 more
ERROR: (DruidDataSource.java:1815)   abandon connection, open stackTrace
at java.lang.Thread.getStackTrace(Thread.java:1588)
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:942)
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4534)
at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:661)
at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4530)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:880)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:872)

错误分析

  • 因业务程序本身运行比较慢长或程序异常后没有关闭连接,导致的数据库连接超过了removeAbandonedTimeout规定的时间没有主动关闭,连接池启用自我保护机制把连接关了,当程序再使用这个连接就报错了。

解决方案

  • removeAbandoned和removeAbandonedTimeout的设计初衷是为了防止连接泄露的情况发生,所以一定要配置适合业务的时间
  • 配置间隔多久才进行一次检测需要关闭的空闲连接,加大超时时间以及是否自动回收超时连接:
#是否自动回收超时连接
spring.datasource.druid.remove-abandoned=true
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.time-between-eviction-runs-millis=60000
#超时时间(以秒数为单位)
spring.datasource.druid.remove-abandoned-timeout-millis=1800

已解决:connection holder is null问题。_第1张图片

  • 配置好后重启服务即可。

你可能感兴趣的:(问题王,java,mysql,java,jdbc)