业务场景:MySQL千万级大表数据查询,连接出现失效问题,异常如下:
The last packet successfully received from the server was 12,327 milliseconds ago. The last packet sent successfully to the server was 12,454 milliseconds ago.
问题应该是由mysql(wait_timeout)关闭连接而druid未能跟踪导致连接失效。网上翻阅了各种资料,如调整timeBetweenEvictionRunsMillis、minEvictableIdleTimeMillis、maxEvictableIdleTimeMillis等的时间,都不能解决问题(有关这几个参数配置的作用,请自行查阅)。
解决方案:connectionProperties 加上配置项connectTimeout=10000;socketTimeout=30000;
另附上druid配置与mysql环境配置
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initialSize=1
spring.datasource.druid.minIdle=3
spring.datasource.druid.maxActive=100
spring.datasource.druid.maxWait=3000
spring.datasource.druid.keepAlive=true
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.maxEvictableIdleTimeMillis=600000
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=false
spring.datasource.druid.filters=stat,wall,slf4j
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;connectTimeout=10000;socketTimeout=30000;
以上内容若有不对的,或者有更好解决方案的,请指教。