Tomcat Jdbc 连接池活动连接

Tomcat Jdbc Connection Pool active connection

我们有一个 spring-boot 应用程序,它使用嵌入式 tomcat 进行部署和 default tomcat-jdbc 连接与 MySQL 后端汇集,不对 MySQL 或 Tomcat 端进行自定义。
该应用程序有几个调度程序,它们 运行 主要在一天中的特定时间运行,即在昨天的最后一个 cron 运行 和今天的第一个 cron 运行 之间,还有更多比 9 小时 的差距。但是,每当 cron 运行 更早时,它从未遇到过空闲连接问题。

现在我们看到一条错误消息
The last packet successfully received from the server was XXXXXXXX milliseconds ago. The last packet sent successfully to the server was XXXXXXXY milliseconds ago.

我总是可以尝试使用 testOnBorrowvalidateQuery adn/or testWhileIdle 等来获得这个工作但是...

我试图了解tomcat-jdbc 连接池中活动连接 的 生命周期。根据文档,MySQL 的 wait_timeout 的默认值是 8 小时 ,而 Tomcat_jdbc 的 idle_connection_timeout 的默认值几乎是6 秒

  1. 如果到处都在使用默认值,那为什么以前从未出现过问题?
  2. 或者每次 cron 启动时 tomcat-jdbc 连接池中的连接都处于活动状态 运行宁然后变得闲置?
  3. spring-boot 应用程序或调度程序的状态有什么不同吗?

问题不在配置或设置中。 spring-boot 应用程序使用 spring-data 库,它利用了底层 connection pool。池根据连接池实现处理连接。然而,@Transactional 的使用决定了何时打开基础连接。如果在 spring-boot app 中指定了 none,则 spring-data 的默认实现会在 crud 操作期间打开它;否则它在用 @Transactional.

注释的应用程序中的方法调用期间打开

在我的例子中是后者.. 打开连接后,非数据库进程花费了时间运行,这使得连接在打开后进入空闲状态,并在稍后实际使用它时抛出异常。