这个问题涉及的方面很多,需要一步步去排查,可能环境有问题,数据库有问题,但是网上最多的应该是如下的方式去解决。
以单个数据源为主,多个数据源基本方法一致。
1、MySQL 5版本之前可以通过在URL后面加入autoReconnect=true,如:
spring.datasource.url=jdbc:mysql://localhost/test?autoReconnect=true
2、application.properties文件中加入:
spring.datasource.test-on-borrow=true #(即在获取Connection对象时检测其可用性),不过这样会影响性能,但是这个配置是最有效的。spring.datasource.test-while-idle=truespring.datasource.time-between-eviction-runs-millis= 3600000
3、粗暴点的直接修改wait_timeout时间:
show global variables like 'wait_timeout';
推荐使用第2种,从配置项入手。
网上有这块的详细解释:
datasource.qss.max-idle=10# Number of ms to wait before throwing an exception if no connection is available.datasource.qss.max-wait=10000datasource.qss.min-idle=5datasource.qss.initial-size=5# Maximum number of active connections that can be allocated from this pool at the same time.datasource.qss.max-active=100datasource.qss.validation-query=SELECT 1#使用testOnBorrow为true(即在获取Connection对象时检测其可用性),不过这样会影响性能# Validate the connection before borrowing it from the pool.datasource.qss.test-on-borrow=true#有些数据库连接的时候有超时限制(mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候设置一个testWhileIdle参数为true,可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建,最大情况的保证从连接池中得到的Connection对象是可用的。datasource.qss.test-while-idle=true#设置当连接被归还时,是否要提交所有还未完成的事务datasource.qss.test-on-return=false#如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。datasource.qss.time-between-eviction-runs-millis=60000# 配置一个连接在池中最小生存的时间,单位是毫秒datasource.qss.min-evictable-idle-time-millis=300000datasource.qss.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=0)
总之,要不断尝试发现问题来解决,上述方式不一定准确。可能代码问题,可以配置问题,也可能是数据库的问题;
参考:
(以上内容转自此篇文章)
(以上小部分配置转自此篇文章)