gpt4 book ai didi

grails - 使用 grails 获取连接池状态

转载 作者:行者123 更新时间:2023-12-01 10:45:38 25 4
gpt4 key购买 nike

我有一个使用 grails 构建的网络服务,它连接到 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 JIRA,有些人似乎有类似的问题。但是我无法使用那里提供的信息修复它。

访问连接池的状态对调试有很大帮助。如何检查连接池的状态以查看在运行时有多少连接处于空闲/忙碌状态?

最佳答案

连接池注册为 javax.sql.DataSource 但该接口(interface)只有获取 Connection 的方法(一个有用户名/密码,一个没有),访问日志编写器,并获取/设置登录超时。其他一切都留给供应商来决定,供应商之间在最初配置池的方法以及在整个应用程序运行过程中使用和监控它们的方法几乎没有共同之处。

所以你真的需要找出哪个库用于池并使用它们的 API。理想情况下,这将与访问 dataSource bean 一样简单(这很简单,只需将其依赖注入(inject)到服务/ Controller /等中。就像任何 bean - 作为类范围字段,在这种情况下 def dataSource) 并打印它的类名。但是我们将数据源包裹在一些代理中以添加一些重要的行为,因此访问起来并不容易

不过你很幸运 - 对于这种情况,我们保留原始的未代理实例并将其注册为 dataSourceUnproxied bean,你也可以依赖注入(inject)(只是不要访问任何它的连接,只有信息)。

很长一段时间以来,我们使用 commons-pool 来管理数据源,但不久前我们切换到 Tomcat JDBC Pool因为基准测试表明它比他们看到的任何其他产品(包括 C3P0)都快,而且它的配置方法是基于 commons-pool 的,所以它基本上是一个具有显着性能提升和更多可配置性的直接替代品。

关于grails - 使用 grails 获取连接池状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26547139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com