我有一个用grails构建的with服务,它连接到一个MySQL数据库。自从我升级到2.4.3之后,连接池没有释放连接就出现了问题,导致了异常:
org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-bio-8080-exec-216] Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available[size:50; busy:50; idle:0; lastwait:30000]这是我的Datasources.groovy
dataSource {
url = "jdbc:mysql://..."
username = "xxx"
password = "xxx"
pooled = true
properties {
maxActive = 50
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
dataSource_survey {
url = "jdbc:mysql://..."
username = "xxx"
password = "xxx"
pooled = true
properties {
maxActive = 50
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}我读过grails,有些人似乎也有类似的问题。但我无法用那里提供的信息来解决这个问题。
访问连接池的状态将大大有助于调试。如何检查连接池的状态以查看运行时有多少连接处于空闲/繁忙状态?
发布于 2014-10-25 03:37:21
连接池被注册为一个javax.sql.DataSource,但是该接口只有用于获取一个Connection (一个带有用户名/密码,另一个没有)、访问日志编写器和获取/设置登录超时的方法。其他一切都由供应商来决定,供应商之间在最初配置池以及在整个应用程序运行过程中使用和监视它们的方法上几乎没有什么共同性。
因此,您确实需要找出用于池的哪个库,并使用它们的API。理想情况下,这将像访问dataSource bean一样简单(这很简单,只需依赖--将它像任何bean一样注入服务/控制器/等等-作为类范围字段,在本例中是def dataSource)并打印它的类名。但是我们将数据源封装在几个代理中,以添加一些重要的行为,因此访问起来不容易。
不过,您很幸运--对于这种情况,我们将原始的未代理实例单独处理,并将其注册为您也可以依赖的dataSourceUnproxied bean -inject(只是不要访问它的任何连接,只访问信息)。
在很长一段时间里,我们使用共用池来管理数据源,但是有一段时间我们改用了Tomcat池,因为基准测试显示它比他们所看的任何其他工具(包括C3P0)都要快,而且它的配置方法是基于共用池的,因此它基本上是一种下降式的替换,具有显着的性能提升和更多的可配置性。
https://stackoverflow.com/questions/26547139
复制相似问题