JDBC连接池不重新打开tomcat中的连接

Dea*_*ean 8 tomcat connection-pooling jdbc 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"/>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我已将autoReconnect包含为true,但事实并非如此.我在8小时后检查了数据库上的进程,这是设置超时的时间.如果有人可以帮助那么请帮助我,因为这已经是一个问题几个月但由于我的软件很快就会出现紧急情况.
先谢谢Dean Chester

小智 7

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

validationQuery="SELECT 1"
Run Code Online (Sandbox Code Playgroud)

  • validationQuery是不够的。请阅读:http://leakfromjavaheap.blogspot.com/2013/11/robust-db-connection-pool-configuration.html (2认同)

Bal*_*usC 5

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

二,请确保您关闭所有资源(Connection,StatementResultSet)在JDBC代码中的finally块.

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

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