取消部署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文件后关闭数据库池连接的主要内容,如果未能解决你的问题,请参考以下文章
将 JDBC 驱动程序发送到 WAR for Tomcat 7
如何关闭 clojure ring web 应用程序中的 Hikari 连接池部署到 elasticbeanstalk 中的 tomcat