【问题标题】:JDBC Connection pool not reopening connections in TomcatJDBC 连接池未在 Tomcat 中重新打开连接
【发布时间】:2010-12-24 15:01:17
【问题描述】:

我已将 Tomcat 设置为使用连接池,但在 MySQL 连接超时后,之前在池中打开的连接未打开。这是我的 context.xml 文件的样子:

<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource"
           maxActive="5" maxIdle="3" maxWait="10000"
           username="uname" password="password" driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/>

如您所见,我已将 autoReconnect 包含为 true,但事实并非如此。我在 8 小时后检查了数据库上的进程,这是设置的超时时间。

【问题讨论】:

    标签: tomcat jdbc connection-pooling tomcat6


    【解决方案1】:

    尝试添加验证查询属性。这应该具有在超时后自动关闭和重新打开连接的效果,如下所示:

    validationQuery="SELECT 1"
    

    【讨论】:

    • 我在另一个论坛上也得到了这个解决方案,并且已经这样做了。
    • validationQuery 是不够的。请阅读:leakfromjavaheap.blogspot.com/2013/11/…
    • testWhileIdletest-on-borrow 属性将使用 validationQuery
    【解决方案2】:

    首先,去掉autoReconnect 属性。连接池不需要这个,可能会导致问题。

    其次,确保在finally 块中关闭 JDBC 代码中的所有资源(ConnectionStatementResultSet)。

    我不确定这是否适用于您的情况,但初学者中的一个常见误解是,他们似乎认为您不需要在池连接的情况下关闭这些资源。这是不真实的。池化连接是连接的包装器(装饰器),它对 close() 方法进行了轻微更改,大致如下所示

    public void close() throws SQLException {
        if (this.connection is still active) {
            do not close this.connection, but just return it to pool for reuse;
        } else {
            actually invoke this.connection.close();
        }
    }
    

    换句话说,关闭它们释放池连接,以便它可以放回池中以供将来重用。如果你在没有关闭它们的情况下获取连接,那么连接池迟早会耗尽连接。

    【讨论】:

      【解决方案3】:

      由于这很紧急并且对于生产,我建议您查看一个不错的连接池,例如c3p0。它更加健壮和可靠,可以更好地处理超时。

      【讨论】:

        【解决方案4】:

        根据您的配置,如果它处于空闲状态,则不应创建另一个连接。尝试添加

          minIdle="3"
        

        使用此设置,DBCP 将始终保持 3 个连接。

        我们在一台使用较少的服务器上看到了完全相同的行为。由于默认连接超时 8 小时,我们早上来的时候看不到任何连接。这正是我们所期望的。但是,有时我们会看到陈旧的连接,第一个请求会失败。要解决这个问题,您需要添加以下属性,

        testWhileIdle="true",
        timeBetweenEvictionRunsMillis="60000"
        

        【讨论】:

          猜你喜欢
          • 2015-12-26
          • 2012-07-12
          • 2013-05-01
          • 2012-03-02
          • 1970-01-01
          • 1970-01-01
          • 2014-12-26
          • 2011-03-06
          • 1970-01-01
          相关资源
          最近更新 更多