代码之家  ›  专栏  ›  技术社区  ›  Matt MacLean

Java+Tomcat,濒死数据库连接?

  •  14
  • Matt MacLean  · 技术社区  · 16 年前

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

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

    com.mysql.jdbc.exceptions.jdbc4.communicationsException: 从服务器成功接收的最后一个数据包为68051秒 以前。最后一个成功发送到服务器的数据包是68051秒 前,它比服务器配置的值长 “等待超时”。您应该考虑到期和/或测试 在应用程序中使用前的连接有效性,增加 服务器配置的客户端超时值,或使用connector/j 连接属性“autoconnect=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 就像错误所说的那样,但这种联系一直在消失。我以前从未见过这种情况。

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

    4 回复  |  直到 5 年前
        1
  •  9
  •   ScArcher2    16 年前

    Tomcat Documentation

    DBCP使用Jakarta Commons数据库连接池。它依赖于雅加达公共资源组件的数量:

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

    这个属性可以帮助您解决问题。

    removeAbandonedTimeout="60"
    

    我正在使用相同的连接池工具,我正在设置这些属性,以防止通过Tomcat配置相同的东西。 但如果第一件事不起作用,试试这些。

    testWhileIdle=true
    timeBetweenEvictionRunsMillis=300000
    
        2
  •  5
  •   Sindri Traustason    16 年前

    只是为了澄清到底是什么导致了这一点。默认情况下,MySQL会在8小时不活动后终止打开的连接。但是,数据库连接池将保留连接的时间超过此时间。

    因此,通过设置timebetweenvictionrunsmillis=300000,您将指示连接池运行连接,并每隔5分钟逐出并关闭空闲的连接。

        3
  •  1
  •   Ophir    15 年前

    从dbcp 1.2开始,不推荐使用removeabandoned选项(尽管 still present 在1.3分公司)。 Here 这是一个非官方的解释。

        4
  •  0
  •   abyx    16 年前

    我不知道上面的答案是否基本上是相同的,但是我们的一些系统大约每周使用一次DB连接,我发现我们向MySQL提供了一个-otimeout标志或类似的标志来设置连接超时。