使用 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 数据包而将其视为“活动”并保持打开状态?
谢谢
oracleUCP 似乎提供了一个选项让您设置保持活动时间。
spring.datasource.ucp.time-to-live-connection-timeout
一般来说,我认为在驱动程序级别上搞乱连接设置不是一个好主意,因为它可能会产生冲突!
您可以使用 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 池上配置了非活动连接超时。
Spring Boot 中 UCP 属性的正确前缀是 spring.datasource.oracleucp (不仅仅是之前答案中的 ucp)
根据答案,我决定不干扰ojdbc设置并将ucp设置为
validateConnectionOnBorrow=true
,secondsToTrustIdleConnection=1800
以实现对断开连接的检测(因为ucp中缺少keepalive选项)