Grails连接池-连接无法关闭?

时间:2018-07-20 07:22:47

标签: database grails groovy connection-pooling java-melody

我有一个带有数据库连接池的grails / groovy Web应用程序。设置如下:

dataSource:
        url: "jdbc:postgresql://192.168.100.53:5432/bhub_dev"
        properties:
          jmxEnabled: true
          initialSize: 5
          maxActive: 25
          minIdle: 5
          maxIdle: 15
          maxWait: 10000
          maxAge: 600000
          timeBetweenEvictionRunsMillis: 5000
          minEvictableIdleTimeMillis: 60000
          validationQuery: SELECT 1
          validationQueryTimeout: 3
          validationInterval: 15000
          testOnBorrow: true
          testWhileIdle: true
          testOnReturn: false
          jdbcInterceptors: ConnectionState
          defaultTransactionIsolation: 2 # TRANSACTION_READ_COMMITTED

我正在使用java-melody进行诊断和监视,并注意到一些奇怪的行为。例如,当执行查询数据库的作业时,连接可以超过maxActive属性。为什么甚至有可能?

enter image description here

我需要显式关闭Grails连接吗?该作业将调用一个服务方法,该方法仅通过withCriteria Grails调用来执行数据库查询,例如:

def activities = WorkActivity.withCriteria{
     eq("workCategoryActive", true)
     order("id", "desc");
}

似乎每次运行时,都会打开2个新连接,并且每次都无法正确关闭。

此外,每刷新一次页面,都会有一些后端调用执行查询,有时甚至在刷新时也会打开2个新连接。

enter image description here

我对Grails开发人员来说还很陌生,所以我不知道是否必须/可以使用Criteria数据库连接来关闭它。

感谢您的帮助。该数据库是PGSQL。

编辑:好的,所以现在我正在看java-melody中的线程诊断,并且看来Tomcat池清洁器处于等待状态,这就是为什么连接计数没有减少的原因?而且似乎每次运行该作业时,都会启动2个线程,而其中一个卡在等待中?到底是怎么回事。

enter image description here

1 个答案:

答案 0 :(得分:0)

您应该看看连接池如何工作,基本上连接没有关闭,它们正在重用并打开。因此,当达到最大值(在您的情况下为50)时,连接将等待空闲。如此工作是因为开放式连接是一项复杂的工作。关于docs,他们说连接已关闭,这意味着它会回到池中,但不要关闭。 The same but more description