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

问题描述 投票:8回答:4

我已经设置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
4个回答
7
投票

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

validationQuery="SELECT 1"

5
投票

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

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

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

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


1
投票

由于这是紧急和生产,我建议你看看像c3p0这样一个像样的连接池。它更强大,更可靠,可以更好地处理超时。


0
投票

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

  minIdle="3"

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

我们看到与轻度使用的服务器完全相同的行为。由于默认连接超时为8小时,我们看到早上来时没有连接。这就是我们的预期。但是,有时我们会看到陈旧的连接,第一个请求将失败。要解决此问题,您需要添加以下属性,

testWhileIdle="true",
timeBetweenEvictionRunsMillis="60000"
© www.soinside.com 2019 - 2024. All rights reserved.