【发布时间】:2016-07-18 19:32:27
【问题描述】:
我正在使用 Grails 2.5.3 和 Tomcat7,经过 8 小时的应用部署后,我们的日志开始出现连接已关闭的问题。一个很好的假设是 MySql 在默认等待时间 8 小时后终止连接。
通过文档,我的池似乎已正确配置以保持空闲连接打开,但似乎并非如此。
我的连接池设置可能有什么问题?
dataSource {
pooled = true
url = 'jdbc:mysql://******.**********.us-east-1.rds.amazonaws.com/*****'
driverClassName = 'com.mysql.jdbc.Driver'
username = '********'
password = '******************'
dialect = org.hibernate.dialect.MySQL5InnoDBDialect
loggingSql = false
properties {
jmxEnabled = true
initialSize = 5
timeBetweenEvictionRunsMillis = 10000
minEvictableIdleTimeMillis = 60000
validationQuery = "SELECT 1"
initSQL = "SELECT 1"
validationQueryTimeout = 10
testOnBorrow = true
testWhileIdle = true
testOnReturn = true
testOnConnect = true
removeAbandonedTimeout = 300
maxActive=100
maxIdle=10
minIdle=1
maxWait=30000
maxAge=900000
removeAbandoned="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.StatementCache;"
}
}
hibernate {
cache.use_second_level_cache=true
cache.use_query_cache=true
cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory'
}
另外,我已经确认运行时的数据源是 (org.apache.tomcat.jdbc.pool.DataSource) 的一个实例
更新 1(未修复) 我们认为我们可能已经发现了问题!我们在 http 会话中存储了一个域类,在阅读了一些关于会话工厂如何工作的信息之后,我们相信存储的 http 对象以某种方式绑定到了一个连接。当用户在 8 小时后从 http 会话访问域类时,我们认为 hibernate 存储了对死连接的引用。它现在正在生产中,我们正在监控。
更新 2(已修复) 我们终于找到了问题所在。删除 removeAbandoned 和 removeAbandonedTimeout 解决了我们所有的问题。我们不完全确定为什么这解决了这个问题,因为我们的假设是这两个属性的存在是为了防止发生什么。唯一的想法是我们的数据库更积极地管理废弃的连接。已经超过 4 周了,没有任何问题。
【问题讨论】:
-
您是否在连接 URL 中添加了 autoReconnect=true?即 mysql://localhost/dbname?autoReconnect=true
-
@SaschaFrinken - 不,你认为这会有帮助吗?
-
当我们遇到同样的问题时它确实如此。试一试。
-
这可能不是问题,只是让您知道.. 它应该是 removeAbandoned=true 而不是 removeAbandoned="true"
标签: mysql grails spring-jdbc