当前位置: 首页 > 知识库问答 >
问题:

JDBC池连接验证

万俟沛
2023-03-14

前几天我经历了应用程序的中断,我需要了解以后如何避免这种情况。

我们有一个运行在Tomcat7上的基于Java的web应用程序。应用程序连接到几个不同的数据源,包括Oracle数据库。

<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)
  • 由于timeBetweenEvictionRunsMillis>0,RemoveBandarded为true,且removeAbandonedTimeout>0
  • 启用了PoolSweeper

让我困惑的是包含了验证查询和validationInterval>0。由于所有测试都被禁用,池清理器是否使用验证查询来检查连接?还是验证查询不相关?

因此,当数据库服务器发生故障时,我相信连接池不会尝试重新建立连接,因为没有启用验证测试。在我看来,如果启用了testOnBorrow,那么当数据库服务器重新启动时,就会建立有效的连接,web应用程序(即tomcat)就不需要重新启动。

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

共有1个答案

陈项禹
2023-03-14

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

maxAge="28800000"

无论连接是否有效,都将保持打开8小时。8小时后,连接关闭,如果请求,将建立一个新的连接,池中没有可用的空闲连接。[1]

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

如果池中的连接在被借用、归还和空闲时有效,则不会对其进行测试。[1]

validationInterval="600000"

有关各个属性的更多信息,请参阅[1]:Apache Tomcat7:the Tomcat JDBC Connection Pool。

 类似资料:
  • 我使用作为我的数据源实现,我的代码获取连接并关闭连接,如下所示: 当我完成连接工作时,我将关闭它 我的问题是:确实是关闭的,所以当连接像一样关闭时,数据源是如何工作的。我听说datasource connection close并不是真正的close,只是release,但我在datasource类中找不到release API。我想知道datasource如何管理数据库连接的创建、关闭和释放。

  • 我们有一个spring-boot应用程序,它使用嵌入式tomcat进行部署,并使用MySQL后端的默认tomcat-jdbc连接池,而没有为MySQL或tomcat端定制。 该应用程序有一些调度程序,它们主要在一天中的特定时间运行,即在昨天的最后一次cron运行和今天的第一次cron运行之间,有超过9个小时的间隙。然而,无论何时cron在早期运行,它都从未遇到过空闲连接问题。 现在我们看到一条错误

  • 我们刚刚从dbcp迁移到tomcat jdbc连池。我们在加载中尝试了系统,收到了以下异常: 请注意: 不忙的连接在哪里?忙的数字在这之后一直在下降,但我们仍然没有得到任何连接。 有什么想法吗? 配置: env:ubuntu和tomcat 6. db-mysql

  • 问题内容: 我想我需要更好地了解连接池的概念。我正在使用Java与ConnectorJ一起工作,并将servlet部署在Apache Tomcat服务器上。我一直在关注该文档,因此我的Tomcat context.xml如下所示: 我使用推荐的方式从数据源获得连接: 我的问题是:为什么我必须在context.xml中为我的数据源指定用户和密码。如果我错了,请纠正我,但我认为连接池的重点是重用拥有相

  • 我们正在用Java重写来自PHP的web应用程序。我认为,但我不是很确定,我们可能会在连接池方面遇到问题。应用程序本身是多租户的,是“独立数据库”和“独立模式”的组合。 对于每个Postgres数据库服务器实例,可以有一个以上的数据库(命名为schemax_XXX),其中包含一个以上的模式(模式是租户)。注册时,可能会发生以下两种情况之一: 在编号最高的schema_XXX数据库中创建新的租户模式

  • 问题内容: 我在GlassFish上有一个Java-JSF Web应用程序,我想在其中使用连接池。因此,我创建了一个有范围的Bean,可与其他Bean的实例一起使用: 这样,连接池很快就会被填满。在“ db-related”视图中进行几次导航后,应用程序将停止以下操作: RAR5117:无法从连接池[mysql_testPool]获取/创建连接。原因:使用中的连接等于最大池大小和已过期的最大等待时