【问题标题】:db pool connections closed after war file is undeployed取消部署war文件后关闭数据库池连接
【发布时间】: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

标签: tomcat jdbc jndi hikaricp tomcat9


【解决方案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 解决。我的环境是:

  1. JVM Azul Zulu 11
  2. 雄猫:7
  3. J/连接器:5.1
  4. MySQL:5.7

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2019-05-19
    • 2015-03-11
    • 2012-06-11
    • 1970-01-01
    • 2021-06-08
    • 2021-10-04
    相关资源
    最近更新 更多