【发布时间】: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)将不需要重新启动。
我对连接验证的工作原理有正确的理解吗?
【问题讨论】: