6

我有一个带有数据库连接池的 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 属性。为什么这甚至可能?

在此处输入图像描述

我是否需要明确关闭 Grails 连接?该作业调用一个服务方法,该方法只是通过 withCriteria Grails 调用执行数据库查询,例如:

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

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

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

在此处输入图像描述

我对 Grails 开发人员很陌生,所以我不知道我是否必须/甚至可以关闭这个 withCriteria 数据库连接。

任何帮助表示赞赏。数据库是 PGSQL。

编辑:好的,所以现在我正在查看 java-melody 中的线程诊断,似乎 Tomcat 池清理器处于等待状态,这就是连接数没有下降的原因?此外,似乎每次运行该作业时,都会启动 2 个线程,而其中一个则陷入等待?这到底是怎么回事。

在此处输入图像描述

4

1 回答 1

-2

您应该看看连接池是如何工作的,基本上连接不会关闭,它们正在重用并打开。因此,当它达到最大值(在您的情况下为 50)时,连接将免费等待。它是这样工作的,因为开放连接是一项复杂的工作。关于文档,他们说连接已关闭,这意味着它会回到池中,但不要关闭。相同但更多的描述

于 2018-07-30T14:40:51.390 回答