取消部署war文件后关闭数据库池连接

Posted

技术标签:

【中文标题】取消部署war文件后关闭数据库池连接【英文标题】:db pool connections closed after war file is undeployed 【发布时间】:2020-09-27 20:59:22 【问题描述】:

从历史上看,我们在部署更新后会完全停止/重新启动 Tomcat。我们正在切换到使用 Tomcat 管理器并重新部署新版本的战争文件,并且在某些情况下还使用 CodeHaus Cargo 部署带有版本后缀(例如 mywar.war##1234)的战争文件。虽然 HikariCP 过去运行顺利,但在 Maven 和 Cargo 进行部署/重新部署后,我们现在看到了致命错误。错误是:

[致命] java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) 已关闭。

我尝试将 singleton="true" 添加到 GlobalResources 和每个 JNDI 中,但这并没有解决问题。

注意:我们的 JNDI 数据源在 GlobalNamingResources 的 ~tomcat/conf/server.xml 中定义,并且在每个 war 文件的 context.xml 中都引用了它们

这是 JNDI 配置。另外,要使用的正确 mysql wait_timeout 值是多少?当前设置为 60(60 秒),略高于我们 jdbc 设置中的 maxLifetime(55000 毫秒或 55 秒)

    <Resource name="jdbc/global_mysql" auth="Container" 
factory="com.zaxxer.hikari.HikariJNDIFactory"
type="javax.sql.DataSource"
minimumIdle="1" 
singleton="true"
maximumPoolSize="3"
maxLifetime="55000"
connectionTimeout="300000"
driverClassName="com.mysql.cj.jdbc.Driver"
dataSource.implicitCachingEnabled="true" 
dataSource.user="<user>"
dataSource.password="<password>"
dataSource.cachePrepStmts="true"
dataSource.prepStmtCacheSize="250"
dataSource.prepStmtCacheSqlLimit="2048"
dataSource.useServerPrepStmts="true"
dataSource.useLocalSessionState="true"
dataSource.rewriteBatchedStatements="true"
dataSource.cacheResultSetMetadata="true"
dataSource.cacheServerConfiguration="true"
dataSource.elideSetAutoCommits="true"
dataSource.maintainTimeStats="false"
jdbcUrl="jdbc:mysql://<host>:3306/db"
/>

【问题讨论】:

我使用 DBCP 池(不是 Hikari 池),我从未见过这样的错误。当 Tomcat.shuts 关闭时,我使用 closeMethod="close" 触发关闭池 可能值得尝试远程调试以捕获池何时以及如何关闭。 (我猜 Web 应用程序被编码为显式关闭它,例如在 ServletContextListener 中)。见cwiki.apache.org/confluence/display/TOMCAT/… 能否提供代码库进行测试? 请添加错误的stacktrace 【参考方案1】:

尝试从 server.xml 中删除 driverClassName。这是documentation

<!-- driverClassName: Class name for the old mm.mysql JDBC driver is
    org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
    Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
    -->

我有相同的致命错误连接并通过删除 driverClassName 解决。我的环境是:

    JVM Azul Zulu 11 雄猫:7 J/连接器:5.1 MySQL:5.7

希望对你有帮助。

【讨论】:

以上是关于取消部署war文件后关闭数据库池连接的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 连接池问题 - 无法在关闭的连接上调用方法

linux系统下部署war包

Tomcat jdbc 连接池在热的变化

将 JDBC 驱动程序发送到 WAR for Tomcat 7

如何关闭 clojure ring web 应用程序中的 Hikari 连接池部署到 elasticbeanstalk 中的 tomcat

Jenkins上War文件部署实战