【问题标题】:Java+Tomcat, Dying database connection?Java+Tomcat,Dying 数据库连接?
【发布时间】:2010-09-06 04:02:28
【问题描述】:

我有一个 tomcat 实例设置,但我在 context.xml 中配置的数据库连接在一段时间不活动后一直死机。

当我检查日志时,我收到以下错误:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 从服务器成功接收到的最后一个数据包是68051秒 前。最后一次成功发送到服务器的数据包是 68051 秒 前,比服务器配置的值长 '等待超时'。您应该考虑到期和/或测试 在您的应用程序中使用之前的连接有效性,增加 服务器为客户端超时配置值,或使用连接器/J 连接属性 'autoReconnect=true' 来避免这个问题。

这里是context.xml中的配置:

<Resource name="dataSourceName" 
        auth="Container" 
        type="javax.sql.DataSource"
        maxActive="100" 
        maxIdle="30" 
        maxWait="10000" 
        username="username" 
        password="********"
        removeAbandoned = "true"
        logAbandoned = "true"
        driverClassName="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=UTF-8"  />

我正在使用autoReconnect=true,就像错误所说的那样,但连接不断中断。我以前从未见过这种情况。

我还验证了所有数据库连接都已正确关闭。

【问题讨论】:

    标签: java mysql database tomcat


    【解决方案1】:

    Tomcat Documentation

    DBCP 使用 Jakarta-Commons 数据库连接池。它依赖于 Jakarta-Commons 组件的数量:

    * Jakarta-Commons DBCP
    * Jakarta-Commons Collections
    * Jakarta-Commons Pool
    

    这个属性可以帮到你。

    removeAbandonedTimeout="60"
    

    我正在使用相同的连接池的东西,我正在设置这些属性以防止它只是没有通过 tomcat 配置的相同的东西。 但如果第一件事不起作用,请尝试这些。

    testWhileIdle=true
    timeBetweenEvictionRunsMillis=300000
    

    【讨论】:

    • 不错。我在 context.xml 中设置了参数,我打算让它静置 24 小时。如果它不起作用,我将不接受答案。但它看起来很有希望!谢谢!
    【解决方案2】:

    我不知道上面的答案是否基本相同,但我们的一些系统大约每周使用一次数据库连接,我看到我们向 mysql 提供了 -Otimeout 标志或类似的东西设置连接超时。

    【讨论】:

      【解决方案3】:

      只是为了澄清实际造成这种情况的原因。默认情况下,MySQL 会在 8 小时不活动后终止打开的连接。但是,数据库连接池将保留连接的时间比这更长。

      因此,通过设置 timeBetweenEvictionRunsMillis=300000,您可以指示连接池每 5 分钟运行一次连接并驱逐和关闭空闲的连接。

      【讨论】:

      • 这个属性的名称是什么?我想仔细检查一下。我只看到“thread_pool_idle_timeout = 60”。
      • @mass 我不知道。我上面的答案是 7 岁,几年来我没有太多使用 Tomcat 或 Servlet 资源。据我所知,timeBetweenEvictionRunsMillis 是 context.xml 中 Resource 标记的属性,而 thread_pool_idle_timeout 是 .property 文件键。
      • 目前据我所知,设置 timeBetweenEvictionRunsMillis 仍然会启动 jdbc 数据源池的连接清除程序。但是,thread_pool_idle_timeout 是我所指的 MySQL 参数。我怀疑当前的默认值少于 8 小时,但还是感谢您的回复。似乎接受的解决方案对 OP 有效,我会试一试。
      【解决方案4】:

      从 DBCP 1.2 开始不推荐使用 removeAbandoned 选项(尽管 1.3 分支中的 still present)。 Here非官方解释。

      【讨论】:

        猜你喜欢
        • 2010-09-06
        • 2015-06-23
        • 1970-01-01
        • 2019-06-09
        • 1970-01-01
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        相关资源
        最近更新 更多