JDBC连接池未在Tomcat中重新打开连接

JDBC连接池未在Tomcat中重新打开连接,tomcat,jdbc,connection-pooling,tomcat6,Tomcat,Jdbc,Connection Pooling,Tomcat6,我已经将Tomcat设置为使用连接池,但是在MySQL连接超时之后,之前在池中打开的连接没有打开。下面是我的context.xml文件的外观: <Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource" maxActive="5" maxIdle="3" maxWait="10000" username="uname" password="password"

我已经将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小时后检查了数据库中的进程,这就是超时设置

由于这是紧急情况,而且对于生产,我建议您考虑一个合适的连接池,例如。它更健壮、更可靠,可以更好地处理超时。

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

其次,确保关闭
finally
块中JDBC代码中的所有资源(
Connection
Statement
ResultSet

我不确定这是否适用于您的情况,但初学者中的一个常见误解是,他们似乎认为在连接池的情况下,您不需要关闭这些资源。这是不真实的。池连接是连接周围的包装器(decorator),该连接的
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();
    }
}

换句话说,关闭它们将释放池连接,以便将其放回池中供将来重用。如果您在未关闭连接的情况下获取连接,则池迟早会耗尽连接。

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

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

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

testWhileIdle="true",
timeBetweenEvictionRunsMillis="60000"

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

validationQuery="SELECT 1"

我在另一个论坛上也得到了这个解决方案,并且已经这样做了。validationQuery是不够的。请阅读:
testWhileIdle
借用测试
属性将使用validationQuery