在Java应用程序中查找连接泄漏

时间:2016-09-13 16:01:23

标签: java oracle connection-leaks

我有一个应用程序在一段时间后开始给我内部服务器错误,有些人告诉我这可能是因为我的应用程序中的连接泄漏。我开始搜索并发现此查询以模拟连接泄漏。

select LAST_CALL_ET, SQL_TEXT, username, machine, to_char(logon_time, 'ddMon hh24:mi') as login, SQL_HASH_VALUE, PREV_HASH_VALUE, status from v$session, v$sql where username='USERNAME' and HASH_VALUE = PREV_HASH_VALUE order by last_call_et desc;

我使用此查询监视我的应用程序,并关闭此结果中显示的查询的所有泄漏连接。但是现在我的应用程序开始为更不活跃的会话提供相同的错误。 我是否使用正确的查询来查找活动会话/连接泄漏?有人告诉我这个查询条件HASH_VALUE = PREV_HASH_VALUE是错误的,但我不知道这些列(没有太多的DB知识。)

谢谢

2 个答案:

答案 0 :(得分:2)

如果您需要查找泄漏,可以使用能够跟踪socket / jdbc泄漏的yourkitjprofiler等分析器。

要修复泄漏,您必须找到打开连接的地方,并使用try-with-resources,这将为您完成所有close()项内容

try (Connection conection = DriverManager.getConnection(url);
     PreparedStatement statement = createPreparedStatement(conection); 
     ResultSet resultSet = statement.executeQuery()) {
     // process the resultSet here, all resources will be cleaned up
}

答案 1 :(得分:0)

大多数连接池都具有记录连接泄漏的配置。我不熟悉DBCP,但documentation表示 logAbandoned 属性会记录连接泄漏。如果将logAbandoned设置为true,则DCBP应在池超时属性之后的某个时间记录堆栈跟踪。堆栈跟踪将包含泄漏连接的打开位置。