jdk8 \ mysql 5.7 \ alibaba druid 1.1.4 \ springBoot 1.5.4.RELEASE
项目环境 :使用率很低的项目 大约只有不到十个接口 操作数据库的间隔最长在12个小时以上
项目启动连接没有任何问题 有时会在20分钟-30分钟之后就报错com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
再次尝试就会报 org.springframework.dao.DataAccessResourceFailureException
我查过网上的办法
1.设置数据库wait_timeout
我查了数据库wait_timeout = 86400
2.autoReconnect=true,设置数据库在遇到异常中断的情况下重新连接。
我的URL:
dbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&pinGlobalTxToPhysicalConnection=true
3.项目设置
validationQuery: SELECT 1
testWhileIdle: true
timeBetweenEvictionRunsMillis: 28000
我的配置
datasource:
# 初始化大小,最小,最大
initialSize: 10 #初始化时建立物理连接的个数
minIdle: 1 #最小连接池数量
maxActive: 300 #最大连接池数量git
maxWait: 30000 #获取连接时最大等待时间,单位毫秒。
timeBetweenEvictionRunsMillis: 10000 #有两个含义: 1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
validationQuery: SELECT 1
testWhileIdle: true #建议配置为true,不影响性能,并且保证安全性。
testOnBorrow: true #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testOnReturn: false #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
poolPreparedStatements: false #是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。
maxPoolPreparedStatementPerConnectionSize: 20
driverClassName: com.mysql.jdbc.Driver
我的代码
@Bean
public XADataSource druidDataSource(){
return druidDataSource(dbUrl,username,password);
}
public XADataSource druidDataSource(String url, String userName, String password){
DruidXADataSource datasource = new DruidXADataSource();
datasource.setUrl(url);
datasource.setUsername(userName);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
//configuration
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
datasource.setConnectionProperties(connectionProperties);
datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
logger.error("druid configuration initialization filter", e);
}
return datasource;
}
感觉并没有什么配置错误 希望看到的大神帮忙讲解一下
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
<p>keepAlive=true</p>
你好 我配置了您说的那个 然后发现30分钟之后还是会有这种问题
回复 <a class="referer" target="_blank">@mlovewt</a> : 哦哦 理解了 我还有个问题就是 对于这种使用率低的项目 连接池的minIdle 、maxActive、maxWait、timeBetweenEvictionRunsMillis 这几个参数设置多大比较合适
回复 <a class="referer" target="_blank">@事儿爹</a> : 不设置这个不保证连接池中的连接是活的,这是后来的版本添加的参数
好的 我试一下 能麻烦讲一下为什么会有这种问题吗
<p>在我的配置里面加了一个</p>
keepAlive: true
然后30分钟之后还是有这种问题