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分钟之后还是有这种问题
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。