springboot框架Druid连接池,使用tidb数据库,偶尔出现db连接断开异常

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.4
  • 【问题描述】:javaWeb程序在切换tidb数据库后,偶尔会抛出db连接断开异常,频率是每天4次左右。

框架:springboot2.2.2.RELEASE
连接池:druid1.1.20

#连接池配置
#####datasource druid pool
spring.datasource.dynamic.druid.filters= stat
spring.datasource.dynamic.druid.initial-size=5
spring.datasource.dynamic.druid.max-active=300
spring.datasource.dynamic.druid.min-idle=16
spring.datasource.dynamic.druid.max-wait=60000
spring.datasource.dynamic.druid.time-between-eviction-runs-millis=360000
spring.datasource.dynamic.druid.min-evictable-idle-time-millis=360000
spring.datasource.dynamic.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.dynamic.druid.test-while-idle=true

tidb查询数据源

spring.datasource.dynamic.datasource.datastidb.username=USERNAME
spring.datasource.dynamic.datasource.datastidb.password=PASSWORD
spring.datasource.dynamic.datasource.datastidb.url=jdbc:mysql://TIDB_DB?useUnicode=true&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&autoReconnect=true&failOverReadOnly=false
spring.datasource.dynamic.datasource.datastidb.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.dynamic.datasource.datastidb.type=com.alibaba.druid.pool.DruidDataSource
#注:为了不暴露真实的数据源,USERNAME,PASSWORD和TIDB_DB是使用临时的字符串

异常信息
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet successfully received from the server was 29,742 milliseconds ago. The last packet sent successfully to the server was 29,742 milliseconds ago.
at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370)
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3461)
略。。。

1 个赞

不知道这两个配置成相同大小是否会有影响,您可以再评估下

     <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
     <property name="timeBetweenEvictionRunsMillis" value="2000" />
  
     <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
     <property name="minEvictableIdleTimeMillis" value="600000" />
     <property name="maxEvictableIdleTimeMillis" value="900000" />

您也可以参考下 如下文档


https://docs.pingcap.com/zh/tidb/stable/java-app-best-practices#探活配置

相关 TiDB 的与空闲超时的 系统变量可以参考如下文档
https://docs.pingcap.com/zh/tidb/stable/system-variables#wait_timeout
https://docs.pingcap.com/zh/tidb/stable/system-variables#interactive_timeout

2 个赞

感谢您!
我试试啊。因为问题出现的频率不高,我可能得明天晚上才能看到结果

:ok_hand:

请问问题解决了吗?我们这边程序也报了错误

重新发帖咨询一下~

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。