2009-12-08 195 views
7

我已经设置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小时后检查了数据库上的进程,这是超时设置。 如果任何人都可以帮助,那么请帮助我,因为这是几个月来的问题,但由于我的软件很快就会出现,它已经出现紧急情况。
由于提前 院长切斯特

回答

6

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

validationQuery="SELECT 1" 
+0

我在另一个论坛上得到了这个解决方案,并且已经这样做了。 – Dean 2009-12-10 15:59:07

+0

validationQuery是不够的。请阅读:http://leakfromjavaheap.blogspot.com/2013/11/robust-db-connection-pool-configuration.html – 2013-11-05 20:37:02

+0

'testWhileIdle'和'test-on-borrow'属性将使用validationQuery – 2017-01-10 07:05:08

1

由于这是迫切和生产,我建议你看一下一个体面的连接池,如c3p0。它更健壮,更可靠,可以更好地处理超时。

5

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

其次,确保您接近所有资源(ConnectionStatementResultSet)在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(); 
    } 
} 

与其他词,关闭它们释放了池连接,以便它可以被放回在池中供未来重用。如果您在不关闭连接的情况下获取连接,那么该池迟早会耗尽连接。

0

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

minIdle="3" 

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

我们看到与轻度使用的服务器完全相同的行为。由于默认的连接超时时间为8小时,因此我们在早上进来时看不到任何连接。这就是我们所期望的。但是,有时我们会看到过时的连接,并且第一个请求会失败。要解决此问题,需要添加以下属性,请尝试添加以下属性:

testWhileIdle="true", 
timeBetweenEvictionRunsMillis="60000"