我有一个应用程序在一段时间后开始给我内部服务器错误,有些人告诉我这可能是因为我的应用程序中的连接泄漏。我开始搜索并发现此查询以模拟连接泄漏。
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知识。)
谢谢
答案 0 :(得分:2)
如果您需要查找泄漏,可以使用能够跟踪socket / jdbc泄漏的yourkit
或jprofiler
等分析器。
要修复泄漏,您必须找到打开连接的地方,并使用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应在池超时属性之后的某个时间记录堆栈跟踪。堆栈跟踪将包含泄漏连接的打开位置。