Java 尝试在数据库重新启动后重新连接jdbc池数据源
我有一个带有Java后端的web应用程序,用于数据库连接。这个很好用 然而,在将其导出到其他位置之前,我正在尝试万无一失,最近发生了一个场景,有人重新启动了SQL Server数据库服务,但没有重新启动Tomcat服务。这导致了SQLException:Java 尝试在数据库重新启动后重新连接jdbc池数据源,java,tomcat,datasource,jdbc-pool,Java,Tomcat,Datasource,Jdbc Pool,我有一个带有Java后端的web应用程序,用于数据库连接。这个很好用 然而,在将其导出到其他位置之前,我正在尝试万无一失,最近发生了一个场景,有人重新启动了SQL Server数据库服务,但没有重新启动Tomcat服务。这导致了SQLException:java.sql.SQLException:I/O错误:对等方重置连接:套接字写入错误,直到我重新启动Tomcat,迫使jdbc池数据源重新连接 我在Tomcat jdbc池文档中寻找某种配置,以告诉数据源尝试重新连接,但我找不到任何东西 有没有
java.sql.SQLException:I/O错误:对等方重置连接:套接字写入错误
,直到我重新启动Tomcat,迫使jdbc池数据源重新连接
我在Tomcat jdbc池文档中寻找某种配置,以告诉数据源尝试重新连接,但我找不到任何东西
有没有人知道是否有这种配置,或者我应该在每次请求之前检查这种情况?不是100%确定这是否是您的问题,但上面说您可以使用
testOnBorrow
和validationQuery
<Resource type="javax.sql.DataSource"
...
testOnBorrow="true"
validationQuery="SELECT 1"
removeAbandoned="true"
/>
在检查同一个问题时,我遇到了这篇文章,其中包含所有应用服务器的自动连接配置 下面是我在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"/>
所有应用服务器的完整自动连接配置都可以在这里找到。只是为了补充Natan Cox的答案 参考-
与Geronimo相比,我仍然希望使用validationQuery
数据库验证查询说明
hsqldb-从信息模式中选择1。系统用户
Oracle-从双精度中选择1
DB2-从sysibm.sysdummy1中选择1
mysql-选择1
microsoft SQL Server-选择1
postgresql-选择1
ingres-选择1
derby-值1
H2-选择1
Firebird-从rdb$数据库中选择1
参考-我试图避免验证查询开销,并在同一链接中使用
timebetweenvictionrunsmillis=“5000”
和minEvictableIdleTimeMillis=“5000”
和minIdle=“0”
找到了另一种方法,似乎可以处理这个问题,谢谢。@Geronimo:我昨天对你的评论投了赞成票,但今天我意识到使用minIdle=“0”
实际上可能更糟:它实际上是在不活动5秒后关闭连接,不管是否正常。所以我不确定更糟糕的是什么:在每次查询之前执行SELECT 1
,或者每5秒不活动就必须重新连接一次……如果发现旧连接已关闭,testOnBorrow=“true”
将自动启动新连接?原始链接已消失,但它已被回送机器记录:testOnBorrow=“true”如果发现旧连接已关闭,是否自动启动新连接?
<Resource type="javax.sql.DataSource"
...
testOnBorrow="true"
validationQuery="SELECT 1"
removeAbandoned="true"
/>