在 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
我们目前正在将应用程序迁移到 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