JDBC池连接验证

时间:2018-12-05 17:30:45

标签: java jdbc

前几天我的应用程序发生了故障,因此我需要了解将来如何避免这种情况。

我们在Tomcat 7上运行了一个基于Java的Web应用程序。该应用程序连接到包括Oracle数据库在内的多个不同数据源。

以下是详细信息,Oracle数据库服务器已关闭,必须重新启动。我的简单理解告诉我,这将切断应用程序与数据库的连接,并且实际上用户报告了应用程序中的错误。

Oracle数据源在Tomcat的sever.xml中设置为GlobalNaming资源:

<Resource name="datasource"
        auth="Container"
        type="javax.sql.DataSource"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        ....
        initialSize="4"
        minIdle="2"
        maxIdle="8"
        maxActive="8"
        maxAge="28800000"
        maxWait="30000"
        testOnBorrow="false"
        testOnReturn="false"
        testWhileIdle="false"
        validationQuery="SELECT 1 FROM dual"
        validationQueryTimeout="10"
        validationInterval="600000"
        timeBetweenEvictionRunsMillis="60000"
        minEvictableIdleTimeMillis="900000"
        removeAbandoned="true"
        removeAbandonedTimeout="60"
        logAbandoned="true"
        jmxEnabled="true" />

这就是我对连接验证的理解。

  • 空闲时(testWhileIdle = false),借用(testOnBorrow = false),返回(testOnReturn = false)时不验证连接
  • 启用PoolSweeper是因为timeBetweenEvictionRunsMillis> 0,removeAbandoned为true,并且removeAbandonedTimeout> 0

让我感到困惑的是,包含了验证查询和validationInterval>0。由于所有测试均已禁用,因此池清除程序是否会使用验证查询来检查连接?还是验证查询不相关?

因此,当数据库服务器关闭时,我认为连接池将不会尝试重新建立连接,因为没有启用验证测试。我认为,如果启用了testOnBorrow,则当数据库服务器恢复正常运行时,将建立有效的连接,并且Web应用程序(意味着tomcat)将不需要重新启动。

我对连接验证的工作原理有正确的理解吗?

1 个答案:

答案 0 :(得分:1)

让我们看一下配置的相关部分,以避免池中无效的连接。

maxAge="28800000"

无论有效与否,连接将保持打开状态8个小时。 8小时后,连接将关闭,如果需要,将建立新的连接,并且池中没有可用的免费连接。 [1]

testOnBorrow="false"
testOnReturn="false"
testWhileIdle="false"

池中的连接在借用,返回和空闲时是否有效,将不进行测试。 [1]

validationInterval="600000"

此属性无效,因为所有连接测试均设置为false。此间隔定义何时需要测试连接。在您的示例中,每隔10分钟将测试一次连接,以防测试属性设置为true。 [1]

使用当前配置,无效的连接最多可以保持打开状态8小时。要启用对打开的连接的验证测试,您必须至少将一个测试属性(testOnBorrow, testOnReturn, testWhileIdle)设置为true。

请注意,对于validationInterval="600000",连接测试/验证将每10分钟进行一次。因此,不管设置了哪个测试属性,无效连接最多可能在池中有10分钟可用。

有关各个属性的更多信息,请查看[1]: Apache Tomcat 7: The Tomcat JDBC Connection Pool