oracle.net.keepAlive 与连接池(Hikari CP/UCP 池空闲连接超时)

问题描述 投票:0回答:4

使用 Hikari 或 Oracle UCP 等连接池,您可以设置池大小(初始化大小、空闲大小、最大大小)和超时(空闲/非活动连接超时)。

在 hikari 中,您可以配置

keepaliveTime
(与长空闲 tiemout / 最大生命周期相结合)以防止防火墙杀死空闲 TCP 连接 (
SQLRecoverableException: Closed Connection
)...

但是在Oracle UCP中,我没有找到启用连接“keepalive”的选项。因此可能可以选择在 jdbc 驱动程序级别上设置它 -

oracle.net.keepAlive; oracle.net.TCP_KEEPIDLE; oracle.net.TCP_KEEPINTERVAL; oracle.net.TCP_KEEPCOUNT;

问题: 如果我在 JDBC 驱动程序上启用 keepalive,当池大小大于

idleTimeout
时,池的
minimumIdle
会发生什么?

池是否会将此类连接视为“空闲”,或者是否会因为 keepalive 数据包而将其视为“活动”并保持打开状态?

谢谢

oracle jdbc connection-pooling hikaricp ucp
4个回答
0
投票

oracleUCP 似乎提供了一个选项让您设置保持活动时间。

spring.datasource.ucp.time-to-live-connection-timeout

一般来说,我认为在驱动程序级别上搞乱连接设置不是一个好主意,因为它可能会产生冲突!

参考: https://docs.oracle.com/en/database/oracle/oracle-database/21/jjuar/oracle/ucp/jdbc/UCPDataSource.html#setTimeToLiveConnectionTimeout_int_


0
投票

您可以使用 setConnectionProperties() API 将 JDBC 驱动程序属性传递给 UCP,如下所示。

PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
Properties props = new Properties();
props.setProperty("oracle.net.keepAlive", "true");
pds.setConnectionProperties(props);

驱动程序 keepAlive 设置对 UCP 池是透明的,如果在 x 秒内处于非活动状态,它将关闭空闲连接,其中 x 在 ucp 池上配置了非活动连接超时。


0
投票

Spring Boot 中 UCP 属性的正确前缀是 spring.datasource.oracleucp (不仅仅是之前答案中的 ucp)


0
投票

根据答案,我决定不干扰ojdbc设置并将ucp设置为

validateConnectionOnBorrow=true
secondsToTrustIdleConnection=1800
以实现对断开连接的检测(因为ucp中缺少keepalive选项)

© www.soinside.com 2019 - 2024. All rights reserved.