Tomcat9+Hibernate+C3P0环境下JDBC会话超时自动重连配置咨询
Hibernate + C3P0 连接Oracle自动重连配置方案
问题描述
在Tomcat 9环境中使用Hibernate + C3P0读取Oracle数据库时,JDBC会话因闲置超时关闭后,应用出现ORA-02396: 已超过最大闲置时间,请重新连接错误,必须重启应用才能恢复。现有配置如下:
hibernate.c3p0.timeout= 300000hibernate.c3p0.idle_test_period= 120
解决方案:可实现自动重连,需补充/调整以下persistence.xml参数
核心配置调整及新增参数
在persistence.xml的<properties>节点中添加或修改以下参数:
<!-- 连接闲置超时时间(秒),必须小于Oracle的会话闲置超时时间 --> <property name="hibernate.c3p0.timeout" value="1740" /> <!-- 定期检查闲置连接的间隔(秒),建议小于timeout值 --> <property name="hibernate.c3p0.idle_test_period" value="180" /> <!-- 获取连接时自动测试有效性,无效则重建 --> <property name="hibernate.c3p0.testConnectionOnCheckout" value="true" /> <!-- Oracle专用的连接测试SQL --> <property name="hibernate.c3p0.preferredTestQuery" value="SELECT 1 FROM DUAL" />
参数说明
- hibernate.c3p0.timeout:设置连接在池中闲置的最长存活时间(单位:秒),必须小于Oracle数据库配置的SESSION_IDLE_TIMEOUT值(通常Oracle默认闲置超时为30分钟/1800秒,这里设为29分钟/1740秒),确保c3p0在Oracle断开连接前主动销毁闲置连接。
- hibernate.c3p0.idle_test_period:定期检查闲置连接的时间间隔(单位:秒),设置为小于timeout的值,能及时检测并销毁即将超时的连接,避免无效连接留在池中。
- hibernate.c3p0.testConnectionOnCheckout:每次从连接池获取连接时自动执行测试SQL,若连接已失效则自动重新创建新连接,确保应用拿到的都是可用连接。
- hibernate.c3p0.preferredTestQuery:指定Oracle兼容的连接测试语句,替代c3p0默认测试语句,避免因语法不兼容导致测试失败。
原理说明
通过缩短c3p0的连接闲置超时时间,让连接池主动清理即将被Oracle断开的闲置连接;同时结合连接获取时的有效性检测,即使存在漏网的无效连接,也能自动重建,彻底避免因连接失效导致的应用报错,无需重启应用即可恢复数据库访问。
内容的提问来源于stack exchange,提问作者Roberto Medina Cervera
相关产品推荐
相关产品推荐

