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

时间:2009-12-08 22:21:36

标签: 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" driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/>

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

4 个答案:

答案 0 :(得分:7)

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

validationQuery="SELECT 1"

答案 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();
    }
}

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

答案 2 :(得分:1)

由于这是紧急的并且对于制作我建议您查看一个像c3p0这样的合适的连接池。它更强大,更可靠,可以更好地处理超时。

答案 3 :(得分:0)

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

  minIdle="3"

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

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

testWhileIdle="true",
timeBetweenEvictionRunsMillis="60000"