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

标签 grails connection-pooling

我有一个使用 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/

相关文章:

model-view-controller - 电话号码的Grails网址映射

grails - Grails Spring Security session.user为空

java - 使用 PoolingClientConnectionManager 时释放连接?

java - 不同模式的 Tomcat JDBC 连接池

java - 连接未被释放到多线程程序中的池

grails - UrlMappings.groovy带参数的默认 View

hibernate - Grails:保存对象时出错,很难理解,请勿使用 'property'关键字

grails:如何更改编译的 GSP(gsp*.class 文件)?

java - 基于 Swing 的应用程序中的连接池

python - 连接池 - SQLAlchemy 和 Flask