2012-07-02 152 views
13

我有一个web应用程序与使用Tomcat jdbc-pool数据库连接的Java后端。这工作正常。尝试数据库后重新连接池JDBC数据源重新启动

但是我想它出口到其他地方之前万无一失了,而最近发生的一种情况,有人重新启动SQL Server数据库服务,但没有重新启动Tomcat服务。这导致了SQLException:java.sql.SQLException: I/O Error: Connection reset by peer: socket write error,直到我重新启动Tomcat,强制jdbc-pool数据源重新连接。

我找了某种在Tomcat JDBC池文档的结构告诉数据源尝试重新连接,但我无法找到任何东西。

有没有人知道是否有某种配置,或者我应该在每次请求之前检查这种情况?

回答

15

不是100%确定如果这是你的问题,但在http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency它说你可以使用testOnBorrowvalidationQuery

<Resource type="javax.sql.DataSource" 
      ... 
      testOnBorrow="true" 
      validationQuery="SELECT 1" 
      removeAbandoned="true" 
      /> 
+3

我试图避免验证查询的开销,发现在同一链接的另一种方法使用'timeBetweenEvictionRunsMillis = “5000”'和'minEvictableIdleTimeMillis = “5000”'和'minIdle =“0”'似乎处理该问题,谢谢。 – Geronimo

0

在检查相同的问题时,我遇到了这个帖子,它有所有应用服务器的自动连接配置。

下面是我在tomcat中用于自动连接的配置,以供参考。

<Resource auth="Container" 
driverClassName="oracle.jdbc.OracleDriver" 
initialSize="5" 
maxActive="120" 
maxIdle="5" 
maxWait="5000" 
name="jdbc/oracle/myds" 
password="secret" 
poolPreparedStatements="true" 
type="javax.sql.DataSource" 
url="jdbc:oracle:thin:@DBHOSTNAME:1521/ServiceName" 
username="testuser" 
validationQuery="select 1 from tab" 
testOnBorrow="true"/> 

完成自动连接配置所有应用服务器可以在这里找到在Datasource autoreconnect in Java Application Servers

0

只是为了添加到纳坦考克斯的答案

参考 - http://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#Common_Attributes

<Resource type="javax.sql.DataSource" 
     ... 
     testOnBorrow="true" 
     validationQuery="SELECT 1" 
     removeAbandoned="true" 
     /> 

作为对Geronimo的,我还是喜欢用validationQuery

数据库validationQuery指出

hsqldb - select 1 from INFORMATION_SCHEMA.SYSTEM_USERS

甲骨文 - select 1 from dual

DB2 - select 1 from sysibm.sysdummy1

MySQL的 - select 1

的Microsoft SQL Server - select 1

PostgreSQL的 - select 1

安格尔 - select 1

德比 - values 1

H2 - select 1

火鸟 - select 1 from rdb$database

参考 - DBCP - validationQuery for different Databases

相关问题