我有一个带有数据库连接池的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开发人员来说还很陌生,所以我不知道是否必须/可以使用Criteria数据库连接来关闭它。
感谢您的帮助。该数据库是PGSQL。
编辑:好的,所以现在我正在看java-melody中的线程诊断,并且看来Tomcat池清洁器处于等待状态,这就是为什么连接计数没有减少的原因?而且似乎每次运行该作业时,都会启动2个线程,而其中一个卡在等待中?到底是怎么回事。
答案 0 :(得分:0)
您应该看看连接池如何工作,基本上连接没有关闭,它们正在重用并打开。因此,当达到最大值(在您的情况下为50)时,连接将等待空闲。如此工作是因为开放式连接是一项复杂的工作。关于docs,他们说连接已关闭,这意味着它会回到池中,但不要关闭。 The same but more description