当前位置: 首页 > 知识库问答 >
问题:

圣杯连接池 - 连接未关闭?

乌杰
2023-03-14

我有一个带有数据库连接池的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调用简单地执行DB查询,如:

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

似乎每次运行这个程序,都会打开两个新的连接,但每次都没有正确关闭。

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

我是Grails dev的新手,所以我不知道我是否必须/甚至可以用标准数据库连接关闭它。

任何帮助都是值得赞赏的。数据库是PGSQL。

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

共有1个答案

汪庆
2023-03-14

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

 类似资料:
  • 在为了使用多线程而修改了一个服务方法之后,我发现如果不止一个用户多次尝试请求页面(并调用服务方法),服务器就会抛出“无法连接,池耗尽”异常。让我提供一个我的服务类的例子。 我已经在这个问题上挣扎了一个多星期,我找不到解决方案。我不太明白Grails如何与会话、连接和事务一起工作。我的猜测是跟随。当调用ConvertDocumentToJSON时,它从池中获取连接(4个用户,每个用户25个线程=10

  • 这就是Grails 2.4.4。我遇到了一个连接池泄漏,似乎与Grails事务管理有关。有人知道问题在哪里吗? 来自Tomcat JDBC池的可疑泄漏检测消息: 在resources.groovy中: 在DataSource.groovy中: TestController.groovy: TestService.groovy: 泄漏检测消息不显示查询是否从事务性服务移动到控制器,我假设这是因为控制

  • 我正在使用DBCP连接池,并创建了一个MBean来在Jconsole中显示连接池的统计信息。我观察到的是,即使应用程序上没有活动(意味着没有页面点击等),连接池统计数据也会显示活动连接。 我们在上面看到的16个虚拟连接并没有降到零。我不知道为什么?有人能解释一下吗? 谢谢

  • 当我使用CloseableHttpClient和do Execute方法时,它在第一次正常工作,但之后从未成功。它将引发表示“连接池关闭”的异常 有人说是因为我还没有关闭客户端有人说是httpClient 4.3中的bug 我的项目不存在上述问题,但仍然无法正常工作

  • 我正在Java中运行Apache HTTP POST请求,每当我超过1300个请求时,就会出现以下错误,我需要发出更多的请求,大约40k,我可以做些什么来纠正相同的错误?

  • 我正在使用HttpClient v4.5.5 我有一个如下: 然后我使用超文本传输协议客户端如下: 通过定期调用(每隔几分钟) 偶尔我会出错 ,据我所知,这种情况要么发生在旧的HttpClient版本上,要么发生在您关闭HttpClient时。我没有这样做。所以我不明白为什么会出现这个错误。它会恢复,但有这样的异常是个问题。