You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:42:19