【问题标题】:JDBC Pool Connection ValidationJDBC 池连接验证
【发布时间】:2019-05-07 08:15:23
【问题描述】:

前几天我的应用程序出现中断,我需要了解如何在将来避免这种情况。

我们有一个在 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)将不需要重新启动。

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

【问题讨论】:

    标签: java jdbc


    【解决方案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

    【讨论】:

    • 感谢您的确认。
    猜你喜欢
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多