在 WAS Liberty 连接池中,我可以在借用时验证连接吗?

In a WAS Liberty connection pool, can I validate connections on borrow?

我们目前正在将应用程序迁移到 Liberty 服务器 (8.5.5.9) 上的 运行。我们发现应用服务器和数据库之间的连接偶尔会被防火墙终止,因为长时间处于空闲状态。发生这种情况时,在下一个 HTTP 请求中,应用程序将收到这些断开的连接之一。

之前,我们一直使用Apache Commons DBCP 来管理连接池。 configuration parameters in a DBCP conneciton pool 之一是 "testOnBorrow",这可防止将应用程序交给这些不良连接之一。

Liberty 管理的数据源中是否有这样的配置参数?

到目前为止,我们已经像这样配置了数据源:

    <dataSource jndiName="jdbc/ora" type="javax.sql.DataSource">
        <properties.oracle 
          user="example" password="{xor}AbCdEfGh123=" 
          URL="jdbc:oracle:thin:@example.com:1521:mydb"
        />
        <connectionManager 
          minPoolSize="3" maxPoolSize="10" maxIdleTime="10m"
          purgePolicy="ValidateAllConnections"
        />
        <jdbcDriver id="oracle-driver" libraryRef="oracle-libs"/>
    </dataSource>

purgePolicy 当前设置为在发现一个错误连接时验证所有连接(例如,当所有连接长时间闲置时一夜之间)。但这一切所做的只是防止将多个不良连接依次交给应用程序。

connectionManager 中的一个选项是设置 agedTimout="20m" 以自动删除已经被防火墙终止的旧连接。但是,这也会终止最近使用过的连接(防止防火墙破坏它们)。

我是不是遗漏了什么明显的东西? 谢谢!

在这种情况下,我建议使用您已经在使用的 maxIdleTime,但将 minPoolSize 减少到 0(或删除它,因为默认值为 0)。

根据 maxIdleTime 文档:

maxIdleTime: Amount of time after which an unused or idle connection can be discarded during pool maintenance, if doing so does not reduce the pool below the minimum size.

因为你有你的 minPoolSize=3,如果池中只有 3 个坏连接,池维护将不会启动,因为维护线程不会占用池大小根据文档低于最小值。因此设置 minPoolSize=0 应该允许 maxIdleTime 清除所有不良连接,就像您在这种情况下所期望的那样。

所以这是我为您建议的最终配置:

<dataSource jndiName="jdbc/ora" type="javax.sql.DataSource">
    <properties.oracle user="example" password="{xor}AbCdEfGh123=" 
                       URL="jdbc:oracle:thin:@example.com:1521:mydb"/>
    <connectionManager maxPoolSize="10" maxIdleTime="18m"/>
    <jdbcDriver id="oracle-driver" libraryRef="oracle-libs"/>
</dataSource>

maxIdleTime 的值假定您的防火墙在 20 分钟后终止连接,并在 18 分钟后触发清理,以便为清理线程提供 2 分钟的时间 window 来清理即将成为坏连接。

这是一个老问题,但对其他人应该有用: 您可以使用“dataSource”的“validationTimeout”属性。根据文档“指定时,池连接在从连接池中重用之前进行验证。”。 这不会在连接被防火墙切断后立即关闭连接,但这将防止应用程序因连接失效而崩溃。

然后您可以将其与 purgePolicy="ValidateAllConnections" 结合使用,以便在检测到某个连接失效时立即重新验证所有连接。

参考:https://openliberty.io/docs/21.0.0.1/reference/config/dataSource.html#dataSource