gpt4 book ai didi

hibernate - 连接池清空 Hibernate 4,但无法找到罪魁祸首

转载 作者:行者123 更新时间:2023-11-28 21:46:33 25 4
gpt4 key购买 nike

我每 5 分钟监控一次 SQL 数据库的连接。几天来它会在 5 个连接左右徘徊(我的闲置),然后突然变成 50。显然这是一个递归问题,因为我不明白为什么我会在 5 分钟内在零流量的情况下从 5 跳到 50。

我正在使用 Hibernate 4 和 Tomcat,我知道 Hibernate 中的一个问题已在 4.3.2 中修补,但我使用的是 4.3.5

更多详情:每天晚上 7:13:20 都会发生池清空事件……听起来太自动了。我正在使用 Quartz,它每 1 分钟运行一次,但我看不出它们之间的关系。

我的属性:

jmxEnabled = true
initialSize = 5
maxActive = 50
minIdle = 5
maxIdle = 25
maxWait = 10000
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
validationQuery = "SELECT 1"
validationQueryTimeout = 3
validationInterval = 15000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
jdbcInterceptors = "ConnectionState"
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED

环境:

  • Tomcat 7.0.59
  • java 1.7.0 更新 76
  • SQL Server 2012

更多信息:我将 quartz 工作频率降低到每 5 分钟一次。当我在应用程序中加载页面/ View 时,事件仍然发生。这大约是晚上 7 点 14 分。我即将降级到 hibernate 3。

更新今天下午6点50分,我在Tomcat Manager中重新加载了应用程序,但事件仍然发生。 Thread Dump

最佳答案

啊,那种错误很有趣。显然,我们无法指出确切的罪魁祸首(除非有人在您提到的库中发现错误),所以让我们看看如何调试它。大致从易到难,但细节取决于您的环境。

  1. 您提供了非常有用的信息:问题总是同时发生。这暗示了两种选择:您使用 Quartz 运行的一个作业占用了连接,或者当时发生了某些事情(可能是外部的)导致您的代码占用了连接。显然,您应该检查您的作业配置和 cron 作业或在数据库中配置的作业或类似的潜在罪魁祸首。请注意,它们可能会提前一段时间开始,稍后才到达该临界状态,因此就我们所知,作业可能会提前 2 小时开始。

  2. 检查您的日志、系统日志和数据库日志,了解当时或之前发生的任何事情。

  3. 仔细检查所有获得连接的东西,如果它总是返回连接。特别是当抛出异常时。失败的一种经典方法是这样的构造(类似 java 的伪代码):

    Connection con;

    try {
    con = getConnection();
    Statement = stmnt = con.createStatement();
    ....
    } finally (Exception ex){
    if (stmnt != null) stmnt.close();
    if (con != null) con.close(); // this will never happen if stmnt.close throws an exceptions

    }
  4. 建立日志记录,让您准确了解何时未返回连接。在你的应用程序中启动任何东西的一切都应该通过某种包装器(围绕 Aspect、Servlet 过滤器或类似的 AOP)。该包装器应执行以下操作:为操作创建一个唯一 ID (UUID) 并放入 MDC of your logging framework .在操作结束时,id 再次被删除。所有其他日志记录都应包含该 ID。也包装你的连接池。跟踪请求连接的时间,包括时间戳、id 和可能的堆栈跟踪(通过创建和存储异常)。记录那个。每次返回连接时记录它的使用时间。此外,每次请求连接时,检查是否有任何连接的使用时间超过某个阈值。

  5. 隔离事物:设置第二个服务器,在其中运行应用程序。它有同样的问题吗?仅在两台服务器中的一台上运行某些部分,它们是否仍然存在问题?继续排除候选人,直到只剩下一个。

关于hibernate - 连接池清空 Hibernate 4,但无法找到罪魁祸首,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30225162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com