我有一个带有Java后端的Web应用程序,它使用Tomcat jdbc-pool进行数据库连接。这很好。
但是我在将其导出到其他位置之前尝试万无一失,最近出现了有人重新启动SQL Server数据库服务但没有重新启动Tomcat服务的情况。这导致了一个SQLException:java.sql.SQLException: I/O Error: Connection reset by peer: socket write error
,直到我重新启动Tomcat,迫使jdbc-pool数据源重新连接。
我在Tomcat jdbc-pool文档中寻找某种配置来告诉数据源尝试重新连接但我找不到任何东西。
有没有人知道是否有某种配置,或者我应该在每次请求之前检查这种情况吗?
答案 0 :(得分:15)
不是100%确定这是否是您的问题,但在http://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency上,它表示您可以将testOnBorrow
与validationQuery
一起使用。
<Resource type="javax.sql.DataSource"
...
testOnBorrow="true"
validationQuery="SELECT 1"
removeAbandoned="true"
/>
答案 1 :(得分:1)
加入Natan Cox的回答
参考 - 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
数据库验证查询
hsqldb - select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
Oracle - select 1 from dual
DB2 - select 1 from sysibm.sysdummy1
mysql - select 1
Microsoft SQL Server - select 1
postgresql - select 1
ingres - select 1
derby - values 1
H2 - select 1
Firebird - select 1 from rdb$database
答案 2 :(得分: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。
中找到