为何WebLogic中LeakedConnectionCount始终显示为0?
解决WebLogic LeakedConnectionCount不增长的问题
首先咱们得明确WebLogic标记连接为「泄漏」的核心逻辑:它不会在连接借出未归还时立刻统计到LeakedConnectionCount,而是要等连接泄漏超时时间(默认300秒/5分钟)过后,才会将未归还的连接计入泄漏计数。你现在看到Connection Unavailable count到10但泄漏计数为0,大概率是还没到超时时间,或者数据源的泄漏检测配置没正确开启。
下面是具体的排查和解决步骤:
1. 确认WebLogic数据源的泄漏检测配置
先登录WebLogic控制台,找到目标数据源:
- 进入数据源的
Configuration->Connection Pool->Advanced标签页 - 确保Connection Leak Timeout已设置(测试时建议设为30秒,方便快速验证)
- 确认Remove Infected Connections Enabled为
true(默认开启,该选项会标记泄漏连接为「受感染」,后续不再复用)
2. 调整测试流程,等待泄漏超时
你的测试代码需要先触发连接泄漏,再等待超过设置的泄漏超时时间,最后查询泄漏计数。修改main方法如下:
public static void main(String[] args) throws InterruptedException { // 先执行泄漏连接的代码 leakDatabaseConnections(); // 等待超过泄漏超时时间(假设你设置的是30秒,这里等35秒) Thread.sleep(35000); // 再查询泄漏状态 Test test = new Test(); System.out.println(test.isConnectionLeaked()); } // 模拟未关闭连接的泄漏场景 private static void leakDatabaseConnections() { try { // 通过JNDI获取数据源(替换为你的数据源JNDI名称) InitialContext ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("your-datasource-jndi-name"); // 循环获取10个连接,不关闭,触发泄漏 for (int i = 0; i < 10; i++) { Connection conn = ds.getConnection(); System.out.println("获取连接 " + (i+1) + " 未关闭"); } } catch (NamingException | SQLException e) { e.printStackTrace(); } }
3. 验证代码中的数据源名称匹配
检查getDataSourceNames()方法返回的名称,是否和WebLogic控制台里的数据源名称完全一致(包括大小写)。如果名称不匹配,代码会遍历到错误的数据源实例,自然查不到正确的泄漏计数。
你可以在代码里打印所有遍历到的数据源名称,确认是否包含目标数据源:
logger.info("********* 遍历到的数据源: " + poolName + " ******");
4. 确认JMX用户权限
确保用于JMX连接的用户拥有足够权限(比如Monitor或Admin角色),否则可能无法访问JDBCDataSourceRuntimeMBeans的LeakedConnectionCount属性。
额外提示:连接泄漏的正确验证
要确保测试代码确实没有关闭资源——比如没有在finally块中关闭Connection、PreparedStatement、ResultSet,也没有使用try-with-resources语法(自动关闭资源)。如果资源被正确关闭,自然不会产生泄漏。
内容的提问来源于stack exchange,提问作者Pankaj Sonagara
相关产品推荐
相关产品推荐

