【问题标题】:web application hangs in tomcat 6.0.21/7.0.11 without clueweb应用程序挂在tomcat 6.0.21/7.0.11中没有线索
【发布时间】:2011-07-16 16:07:30
【问题描述】:

我只有一个几分钟后挂起的 Web 应用程序。基本上,这是一个用于构建和预览表单的应用程序,非常定制化,经过几分钟的密集用户交互后,该应用程序就停止了工作。这意味着,请求已完成并且永远不会返回回复。

我“有点”迷失了方向,因为我也没有找到任何关于 tomcat 日志和应用程序日志中挂起的线索。应用服务器正在运行,因为我正在使用 lambda/psi-probe,并且可以毫无问题地检查任何其他甚至是麻烦的应用程序(探针本身是另一个 Web 应用程序)。

该应用程序使用了休眠,它在很长一段时间内都可以正常工作,最近,为了提高性能(如果你只使用它,休眠会注入很多查询)我已经通过 java.sql 标准 api 引入了本机 sql。我小心不要将两者混合使用,它们仅在 jsp 中使用,首先使用 hibernate 检索一些(少数)对象,然后使用 jdbc 使用一些逻辑。在使用 jdbc 之前关闭 Hibernate 会话。

我已经阅读了一些关于数据库连接问题(我已经检查了几次并且数据库服务器运行正常)、死锁或失控线程的内容,在 VisualVM 中使用 VisualVM 进行了检查。

那么,任何人都可以提供有关查找或捕获挂起的线索吗?可以提供一些线索来使用 VisualVM 捕获或捕获假设的失控线程或死锁吗?后者会启发我,因为我只看到等待和运行的线程。

我在 mac osx 和 linux(开发和预生产机器)上使用 tomcat 6.0.21(我总是尝试 7.0.11,结果相同)java 1.6

肯定欢迎任何想法 谢谢

w 我来了

【问题讨论】:

    标签: hibernate web-applications tomcat freeze visualvm


    【解决方案1】:

    请确保关闭任何 JDBC 调用,如下所示: 参考:http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html#Preventing_dB_connection_pool_leaks

    以下是使用从连接池获得的数据库连接的正确编写代码示例:

      Connection conn = null;
      Statement stmt = null;  // Or PreparedStatement if needed
      ResultSet rs = null;
      try {
        conn = ... get connection from connection pool ...
        stmt = conn.createStatement("select ...");
        rs = stmt.executeQuery();
        ... iterate through the result set ...
        rs.close();
        rs = null;
        stmt.close();
        stmt = null;
        conn.close(); // Return to connection pool
        conn = null;  // Make sure we don't close it twice
      } catch (SQLException e) {
        ... deal with errors ...
      } finally {
        // Always make sure result sets and statements are closed,
        // and the connection is returned to the pool
        if (rs != null) {
          try { rs.close(); } catch (SQLException e) { ; }
          rs = null;
        }
        if (stmt != null) {
          try { stmt.close(); } catch (SQLException e) { ; }
          stmt = null;
        }
        if (conn != null) {
          try { conn.close(); } catch (SQLException e) { ; }
          conn = null;
        }
      }
    

    "

    【讨论】:

      【解决方案2】:

      我也遇到过类似的情况。问题是一些数据库连接从未返回到连接池。达到限制后,应用程序将冻结,没有异常或错误。你也可能是这种情况。打开连接池中的废弃连接日志记录,您可能需要检查是否有任何恶意连接。

      【讨论】:

      • 我也有类似的问题。。是tomcat6的bug吗?
      • 对你们有用吗?我有同样的问题,我的应用程序在 12-18 小时后停止响应
      • @AmolGhotankar 应用程序挂起时你的堆空间情况如何。尝试找出代码中的任何内存泄漏。还要检查到数据库连接池的未返回连接。
      • 连接永远不会返回到池中。怎么解决 ?我正在使用带有 c3p0 的休眠方式
      【解决方案3】:

      尝试运行 jconsole(如果在挂起的机器上无法执行此操作,则需要启用远程 JMX,重新启动 JVM 并重现挂起),然后单击线程选项卡并单击关于检测死锁。这可能会提供一些帮助。

      如您所说,其他要使用的东西是 VisualVM 或 JCarder

      编辑

      看到您的评论后,另一个尝试是:

      1. 启动 JConsole 并连接到挂起的 VM
      2. 导航到 MBean → com.sun.management → HotSpotDiagnostic → 操作
      3. 会有一个名为dumpHeap 的按钮,旁边有两个文本框。在第一个文本框中,输入一个唯一的名称 - 我使用我的首字母和日期之类的名称 - rt20110317。将第二个文本框设置为 true。点击dumpHeap 按钮。

      这会将堆写入一个大文件。找到此文件并将其加载到Eclipse MAT。该工具提供了用于查看 VM 状态的各种有用的点点滴滴。甚至还有一些用于查找内存泄漏的向导,如果它是由于相同类型的症状,它们还可以找到您的 VM 挂起的原因。

      【讨论】:

      • 对不起,它没有提供任何新的东西,应用程序挂起,我没有看到任何特别的东西
      • @willy 我添加了另一个建议
      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 2014-01-13
      • 1970-01-01
      相关资源
      最近更新 更多