Java 尝试在数据库重新启动后重新连接jdbc池数据源

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后端的web应用程序,用于数据库连接。这个很好用

然而,在将其导出到其他位置之前,我正在尝试万无一失,最近发生了一个场景,有人重新启动了SQL Server数据库服务,但没有重新启动Tomcat服务。这导致了SQLException:
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"
        />