JDBC连接池不能重新连接tomcat中的连接
问题描述:
我已经设置tomcat使用连接池,但在mysql连接超时之后,以前在池中打开的连接没有打开。以下是我的context.xml文件的样子:JDBC连接池不能重新连接tomcat中的连接
<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小时后检查了数据库上的进程,这是超时设置。 如果任何人都可以帮助,那么请帮助我,因为这是几个月来的问题,但由于我的软件很快就会出现,它已经出现紧急情况。
由于提前 院长切斯特
答
尝试添加验证查询属性。这应该有这样的超时后自动关闭和重新打开连接的效果:
validationQuery="SELECT 1"
答
首先,摆脱autoReconnect
属性。您不需要连接池,这可能会导致问题。
其次,确保您接近所有资源(Connection
,Statement
和ResultSet
)在finally
块JDBC代码。
我不确定这是否适用于您的案例,但初创公司之间常见的误解是,他们似乎认为您不需要关闭连接池中的资源。这是不真实的。连接池是一个包装(装饰),在其周围有微微一变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();
}
}
与其他词,关闭它们释放了池连接,以便它可以被放回在池中供未来重用。如果您在不关闭连接的情况下获取连接,那么该池迟早会耗尽连接。
答
使用您的配置,如果它闲置,它不应该创建另一个连接。尝试添加
minIdle="3"
使用此设置,DBCP将始终保持3个连接。
我们看到与轻度使用的服务器完全相同的行为。由于默认的连接超时时间为8小时,因此我们在早上进来时看不到任何连接。这就是我们所期望的。但是,有时我们会看到过时的连接,并且第一个请求会失败。要解决此问题,需要添加以下属性,请尝试添加以下属性:
testWhileIdle="true",
timeBetweenEvictionRunsMillis="60000"
我在另一个论坛上得到了这个解决方案,并且已经这样做了。 – Dean 2009-12-10 15:59:07
validationQuery是不够的。请阅读:http://leakfromjavaheap.blogspot.com/2013/11/robust-db-connection-pool-configuration.html – 2013-11-05 20:37:02
'testWhileIdle'和'test-on-borrow'属性将使用validationQuery – 2017-01-10 07:05:08