【问题标题】:Find Connection leak in Java application在 Java 应用程序中查找连接泄漏
【发布时间】: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 是错误的,但是我不知道这些列(数据库知识不多)。

谢谢

【问题讨论】:

  • 您要关闭所有的StatementPreparedStatementResultSetConnection 对象吗?
  • @copeg 是的,先生,目前我搜索结果中的所有查询并关闭所有内容。但有时我在非活动会话结果中看到相同的查询阻塞了一些其他查询,即使连接和其他对象已关闭。
  • 这是一个 Web 应用程序还是独立应用程序?它使用什么连接池库?
  • @JeffMiller 这是一个网络应用程序。我正在使用 tomcat JNDI 和 DBCP 。我正在关闭每个打开的连接,但结果中出现相同的查询并阻止其他查询。
  • 听起来像是在常规代码块中关闭资源,但它需要在 finally 块中完成,因此即使在异常情况下也会发生。这可以解释为什么您仍在泄漏资源,但只是偶尔。使用 try-with-resources 会自动为您处理。

标签: java oracle connection-leaks


【解决方案1】:

如果您需要找出泄漏,您可以使用像 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
}

【讨论】:

  • 我正在关闭所有找到的连接,但仍有一些查询阻止了其他人。我将尝试“try-with-resources”,看看这是否能解决问题。谢谢
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2018-11-15
    • 2014-01-02
    • 1970-01-01
    • 2014-10-01
    相关资源
    最近更新 更多