【发布时间】:2016-09-13 16:01:23
【问题描述】:
我有一个应用程序在一段时间后开始给我内部服务器错误,我问过一些人告诉我这可能是因为我的应用程序中的连接泄漏。我开始搜索,发现这个查询是为了模拟连接泄漏。
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 是错误的,但是我不知道这些列(数据库知识不多)。
谢谢
【问题讨论】:
-
您要关闭所有的
Statement、PreparedStatement、ResultSet和Connection对象吗? -
@copeg 是的,先生,目前我搜索结果中的所有查询并关闭所有内容。但有时我在非活动会话结果中看到相同的查询阻塞了一些其他查询,即使连接和其他对象已关闭。
-
这是一个 Web 应用程序还是独立应用程序?它使用什么连接池库?
-
@JeffMiller 这是一个网络应用程序。我正在使用 tomcat JNDI 和 DBCP 。我正在关闭每个打开的连接,但结果中出现相同的查询并阻止其他查询。
-
听起来像是在常规代码块中关闭资源,但它需要在 finally 块中完成,因此即使在异常情况下也会发生。这可以解释为什么您仍在泄漏资源,但只是偶尔。使用 try-with-resources 会自动为您处理。
标签: java oracle connection-leaks