20

我有一个带有 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 文档中寻找某种配置来告诉数据源尝试重新连接,但我找不到任何东西。

有谁知道这是否有某种配置,或者我应该在每次请求之前检查这个条件吗?

4

3 回答 3

20

不是 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"
            />
于 2012-07-02T22:48:00.017 回答
1

在检查相同的问题时,我遇到了这篇文章,其中包含所有应用服务器的自动连接配置。

以下是我在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"/>

所有应用程序服务器的完整自动连接配置可以在 Java 应用程序服务器中的数据源自动重新连接中找到。

于 2016-05-20T23:17:52.933 回答
1

只是为了补充纳坦考克斯的答案

参考 - 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

甲骨文——select 1 from dual

DB2 -select 1 from sysibm.sysdummy1

mysql -select 1

微软 SQL Server -select 1

PostgreSQL -select 1

入口——select 1

德比-values 1

H2 -select 1

火鸟-select 1 from rdb$database

参考 - DBCP - 不同数据库的validationQuery

于 2017-11-30T00:05:59.600 回答