Java应用Oracle连接闲置断开,如何设置CONNECTION_PROPERTY_NET_KEEPALIVE属性
解决Java连接Oracle闲置后断开的保活配置方案
对应报错
IO Error: Connection reset; nested exception is java.sql.SQLRecoverableException
针对Oracle JDBC连接闲置后被断开的问题,可通过以下几种方式配置连接保活:
1. JDBC URL直接添加保活参数
在连接URL中嵌入TCP层面的保活配置,这是最直接的方式:
oracle.net.keepAlive=true:启用TCP连接保活机制oracle.net.keepAliveInterval=30:设置保活探测间隔(单位:秒,建议小于数据库端的连接超时阈值)
示例URL:
String jdbcUrl = "jdbc:oracle:thin:@//db-host:1521/orcl?oracle.net.keepAlive=true&oracle.net.keepAliveInterval=30";
2. 连接池层面配置(以HikariCP为例)
如果使用连接池,除了JDBC参数,还需配置连接有效性校验,避免获取到已失效的连接:
connectionTestQuery=SELECT 1 FROM DUAL:每次从连接池获取连接前执行校验keepaliveTime=30000:定期对闲置连接发起保活探测(单位:毫秒)idleTimeout=1800000:设置连接闲置超时时间,自动回收长时间闲置的连接
示例代码:
HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:oracle:thin:@//db-host:1521/orcl"); config.setUsername("db-user"); config.setPassword("db-pass"); config.setConnectionTestQuery("SELECT 1 FROM DUAL"); config.setKeepaliveTime(30000); config.setIdleTimeout(1800000); HikariDataSource dataSource = new HikariDataSource(config);
3. 通过Properties对象配置JDBC属性
也可以将保活属性封装到Properties中,再传入驱动获取连接:
Properties props = new Properties(); props.setProperty("user", "db-user"); props.setProperty("password", "db-pass"); props.setProperty("oracle.net.keepAlive", "true"); props.setProperty("oracle.net.keepAliveInterval", "30"); Connection connection = DriverManager.getConnection(jdbcUrl, props);
注意事项
- 保活间隔需小于Oracle数据库端的
SQLNET.EXPIRE_TIME参数值,否则数据库会先断开连接 - 连接池校验与JDBC保活属性可配合使用,提升连接稳定性
- 不同连接池的配置参数存在差异,比如Tomcat JDBC Pool需配置
validationQuery和testOnBorrow参数
内容的提问来源于stack exchange,提问作者Doofenshmirtz
相关产品推荐
相关产品推荐

