3

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

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 是错误的,但我不知道这些列(数据库知识不多。)

谢谢

4

2 回答 2

3

如果您需要找出泄漏,您可以使用类似yourkitjprofiler能够跟踪套接字/jdbc 泄漏的分析器。

要修复泄漏,您必须找出打开连接的位置并使用 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
}
于 2016-09-13T16:04:03.970 回答
0

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

于 2016-09-14T12:01:54.407 回答