0

我在使用 PostgreSQL 9.5.8 的 Payara 4.1 上运行 JEE 应用程序。连接池的配置方式如下。

<jdbc-resource poolName="<poolName>" jndiName="<jndiName>" isConnectionValidationRequired="true"
connectionValidationMethod="table" validationTableName="version()" maxPoolSize="30" 
validateAtmostOncePeriodInSeconds="30" statementTimeoutInSeconds="30" isTimerPool="true" steadyPoolSize="5" 
idleTimeoutInSeconds="0" connectionCreationRetryAttempts="100000" connectionCreationRetryIntervalInSeconds="30" 
maxWaitTimeInMillis="2000">

根据监视器的说法,应用程序在运行时需要 1-3 个 DB 连接到 postgres。稳定池大小设置为 5,最大池大小为 30。

我看到,应用程序每天大约 4 次打开与数据库的所有连接,达到最大池大小限制。此时对服务器的一些请求失败,但有异常: java.sql.SQLException: Error in allocating a connection. Cause: In-use connections equal max-pool-size and expired max-wait-time. Cannot allocate more connections.

几秒钟后,所有问题都消失了,服务器运行良好,直到下一次打嗝。

我已请求执行一些 TCP 转储以仔细查看究竟发生了什么。我看到:

  1. 在打开了 30 个连接(套接字)之后,大部分连接都很少使用。
  2. 一段时间后(1h 左右),服务器尝试访问一些这样的池连接以实现套接字已关闭(DB 立即使用 TCP RST 响应)。
  3. 随着池连接数减少达到稳定池大小,连接池打开 25 个连接(套接字),这需要一些时间(每个连接大约 0.5 到 1 秒 - 不知道为什么这么长,因为 TCP 握手是立即的)。此时一些服务器事务失败。
  4. 循环重复。

这个问题快把我逼疯了。我想知道,我是否遗漏了一些重要的池配置来更频繁地重新验证连接,但找不到任何有用的东西。

编辑:什么没有帮助,因为我们已经测试过了:

  • 使池大小更大(同样的问题)
  • 删除idleTimeoutInSeconds="0". 我们每隔 10 分钟就会遇到一次连接池问题。
4

0 回答 0