首页 文章

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

提问于
浏览
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 回答

  • 0

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

    validationQuery="SELECT 1"
    
  • 5

    首先,摆脱 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();
        }
    }
    

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

  • 7

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

  • 1

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

    minIdle="3"
    

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

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

    testWhileIdle="true",
    timeBetweenEvictionRunsMillis="60000"
    

相关问题