使用spring boot 1.5 线程池连接MySQL时,mysql数据库wait_timeout 为8个小时,这样子程序一晚上没有数据库操作后,连接会断开。第二天访问接口会出错。出现这种问题得原因是1.x默认数据库连接池中的数据库连永不超时,而mysql超时时间为8个小时,这样就会导致很多闲置的连接其实已经断开了。
解决方案有两种:
1.修改mysql的超时时间为永不超时,具体方案 自行百度。
2.设置spring boot DataSource 属性(重点介绍)
查看源码DataSourceConfiguration.class(spring-boot-autoconfigure包中)发现spring boot 1.X 默认采用tomcat连接池(官方文档实锤,
2.X 更改为HikariCP)
,故需要对tomcat 连接池进行配置,
源码如下,
/**
* Tomcat Pool DataSource configuration.
*/
@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)
static class Tomcat {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.tomcat")
public org.apache.tomcat.jdbc.pool.DataSource dataSource(
DataSourceProperties properties) {
org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource(
properties, org.apache.tomcat.jdbc.pool.DataSource.class);
DatabaseDriver databaseDriver = DatabaseDriver
.fromJdbcUrl(properties.determineUrl());
String validationQuery = databaseDriver.getValidationQuery();
if (validationQuery != null) {
dataSource.setTestOnBorrow(true);
dataSource.setValidationQuery(validationQuery);
}
return dataSource;
}
}
故此问题解决方案如下:
在配置文件中增加tomcat数据源的配置
spring.datasource.tomcat.initial-size=10
#最大空闲连接
spring.datasource.tomcat.max-idle=20
#最小空闲连接
spring.datasource.tomcat.min-idle=5
#最大连接数量
spring.datasource.tomcat.max-active=50
#是否在自动回收超时连接的时候打印连接的超时错误
spring.datasource.tomcat.log-abandoned=true
#是否自动回收超时连接
spring.datasource.tomcat.remove-abandoned=true
#超时时间(以秒数为单位)
spring.datasource.tomcat.remove-abandoned-timeout=180
##<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
spring.datasource.tomcat.max-wait=1000
spring.datasource.tomcat.test-while-idle=true
#检测数据库的查询语句
spring.datasource.tomcat.validation-query=select 1
spring.datasource.tomcat.test-on-borrow=true
#每隔五分钟检测空闲超过10分钟的连接
spring.datasource.tomcat.min-evictable-idle-time-millis=600000
spring.datasource.tomcat.time-between-eviction-runs-millis=300000