Tomcat 7 - 忽略数据库连接池参数 (DBCP)

Posted

技术标签:

【中文标题】Tomcat 7 - 忽略数据库连接池参数 (DBCP)【英文标题】:Tomcat 7 - Ignoring db conections pool parameters (DBCP) 【发布时间】:2019-09-25 04:09:03 【问题描述】:

我们面临一个问题,即在 Tomcat 7 重新启动期间与数据库建立的连接数爆炸式增长。

我们的配置如下,在 Tomcat 的 context.xml 中设置:

<Resource auth="Container"
            driverClassName="oracle.jdbc.driver.OracleDriver"
            initialSize="1"
            maxActive="10"
            maxAge="600000"
            maxIdle="5"
            maxOpenPreparedStatements="200"
            maxWait="10000"
            minEvictableIdleTimeMillis="60000"
            minIdle="0"
            name="jdbc/backoffice"
            password="backoffice"
            poolPreparedStatements="true"
            rollbackOnReturn="true"
            testWhileIdle="true"
            timeBetweenEvictionRunsMillis="6000000"
            type="javax.sql.DataSource"
            url="jdbc:oracle:thin:@127.0.0.1:1521:DATABASE"
            username="backoffice"
            validationQuery="SELECT SYSDATE FROM DUAL"
            removeAbandoned="true"
            removeAbandonedTimeout="60"
            logAbandoned="true"
    />

Tomcat 重启后,打开的连接数接近 700。 重新部署战争(重命名为“.war_bk”或重命名回“.war”)解决了问题。

为什么会这样? 我们可以做些什么不同的事情?

【问题讨论】:

Tomcat 是否有可能没有完全关闭?我以前见过这个,Tomcat 的java 进程仍在运行,但释放了 TCP 端口,因此下一次启动工作正常。当你重新部署时,可能会发生类似的事情。 @a_horse_with_no_name 我们总是使用“ps -ef | grep java”检查tomcat是否关闭(在问题开始之前)。如果它还没有倒下,我们就杀了它。无论如何,我们认为如果是问题所在,连接数将接近设置为池限制的两倍,但它接近 700。 tomcat 运行在哪个操作系统上?你如何重新启动tomcat?请发布确切的命令。 @LuisMuñoz 它在 CentOS 上运行。 “service tomcat stop”,之后我们使用“ps -ef | grep tomcat”检查并开始使用“service tomcat start”。 查看war里面的context.xml,可能有重复资源。 【参考方案1】:

也为maxConnLifetimeMillis添加值

maxConnLifetimeMillis -1 连接的最大生命周期(以毫秒为单位)。超过此时间后,连接将无法通过下一次激活、钝化或验证测试。值为零或更小意味着连接具有无限的生命周期。

还有maxTotal

maxTotal 8 可以同时从此池中分配的最大活动连接数,或者为负数表示无限制。

您可以将validationQuery 更改为更简单的查询

validationQuery="SELECT 1 FROM DUAL"

【讨论】:

以上是关于Tomcat 7 - 忽略数据库连接池参数 (DBCP)的主要内容,如果未能解决你的问题,请参考以下文章

如何记录 Tomcat 7 JDBC 连接池、连接创建

Tomcat 7 和 Oracle 连接池

使用 Java 和 Tomcat 7 的基本数据库连接池

Tomcat 连接池 - tomcat 7

Hibernate多库连接池

数据库连接池的几个参数-以tomcat-jdbc举例