Tomcat9连接池对象未归还问题求助:适配Oracle10g的ojdbc版本
兼容ojdbc库推荐
针对JDK1.8 + Tomcat9 + Oracle 10g环境,推荐使用ojdbc6:
- 适配JDK1.6至JDK1.8,完美匹配你的JDK版本
- 原生支持Oracle 10g数据库协议
- 与Tomcat9的JDBC连接池(Tomcat DBCP)完全兼容
连接池未归还问题的解决建议
你的错误提示表明存在数据库连接泄露(创建的连接未正常归还到池中),结合你的context.xml配置,可按以下步骤处理:
1. 精准定位泄露代码
你已开启logAbandoned="true",Tomcat会在检测到遗弃连接时打印创建该连接的堆栈信息。找到日志中对应的代码位置,重点检查:
- 是否所有
Connection、Statement、ResultSet都在finally块中执行关闭操作 - 改用JDK1.8支持的try-with-resources语法,自动释放资源,示例:
try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM table")) { // 业务逻辑 } catch (SQLException e) { // 异常处理 }
2. 优化连接池配置
调整context.xml中的数据源参数,增强连接管理能力:
<Resource name="jdbc/AppConnectionDS" auth="Container" type="javax.sql.DataSource" logAbandoned="true" maxTotal="25" maxIdle="10" maxWaitMillis="30000" <!-- 改为30秒超时,避免线程无限阻塞 --> username="XXX" removeAbandonedOnBorrow="true" removeAbandonedTimeout="60" password="*****" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@xxxx" validationQuery="select 1 from dual" testOnBorrow="true" <!-- 借连接时验证有效性 --> testWhileIdle="true" <!-- 定期检查空闲连接 --> timeBetweenEvictionRunsMillis="300000" <!-- 每5分钟执行一次空闲连接检查 --> />
3. 排查代码中的连接误用场景
- 禁止将
Connection对象存入全局变量、静态变量或会话(Session)中,避免连接被长期占用 - 确保事务操作(commit/rollback)完成后,连接被正常释放
- 检查是否存在未捕获的异常,导致连接关闭代码未执行
4. 监控连接池状态
通过Tomcat管理控制台(如/manager/html)查看连接池的实时状态:
- 关注
Active Connections(活跃连接数)是否持续接近maxTotal - 查看
Abandoned Connections统计,确认泄露是否持续发生
内容的提问来源于stack exchange,提问作者Sup
相关产品推荐
相关产品推荐

