【发布时间】: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