0

我们有一个 spring-boot 应用程序,它使用嵌入式 tomcat 进行部署,默认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和/或testWhileIdle等作为 reqd 来使其正常工作,但是......

我试图理解tomcat-jdbc 连接池中活动连接的生命周期。根据文档,wait_timeoutMySQL的默认值为8 hrs,而idle_connection_timeoutTomcat_jdbc 的默认值为接近6 secs

  1. 如果默认值到处都在使用,那么为什么以前从未出现过问题?
  2. 还是每次cron开始运行时tomcat-jdbc连接池中的连接都处于活动状态并且此后变得空闲?
  3. 是 spring-boot 应用程序的状态还是调度程序的状态有什么不同?
4

1 回答 1

0

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

在我的情况下是后者..打开连接后,一个耗时的非数据库进程正在运行,这使得连接在打开后处于空闲状态,并且在稍后实际使用它时抛出异常。

于 2017-08-07T06:31:56.230 回答