8

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

4

4 回答 4

7

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

validationQuery="SELECT 1"
于 2009-12-09T01:55:31.283 回答
5

首先,摆脱autoReconnect财产。对于连接池,您不需要它,并且可能会导致问题。

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

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

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

于 2009-12-08T23:03:42.263 回答
1

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

于 2009-12-08T22:24:36.353 回答
0

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

  minIdle="3"

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

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

testWhileIdle="true",
timeBetweenEvictionRunsMillis="60000"
于 2009-12-09T01:45:13.390 回答