1

我们有一个使用 Tomcat JDBC 连接池的应用程序,它与 Spring Boot 和 Hibernate 一起配置。连接池本身运行良好(我已经能够通过池提供的 JMX MBean 验证),但特定参数似乎不起作用。

根据Tomcat 文档,如果“removeAbandoned”设置为 true,则如果连接的使用时间超过 removeAbandonedTimeout,则该连接被视为已放弃并有资格删除。因此,我将“removeAbandoned”设置为 true,将“removeAbandonedTimeout”设置为 20(秒)。我已经能够使用 JMX MBean 验证这两个参数是否已正确设置。

为了测试放弃的连接是否真的被删除,我手动锁定了我的一个数据库表,并在几个浏览器选项卡上打开了访问此类表的页面。每个人都打开了一个到我的数据库的新连接,因为我能够使用 JMX MBean 和使用show status where `variable_name` = 'Threads_connected';. 但是,在 20 秒过去后,这些连接都没有被删除。我什至等了更长的时间,直到我打开桌子,他们什么也没发生。

根据我从 Tomcat 文档中了解到的情况,这些连接都应该有资格被删除,因为它们都在使用中并且持续时间超过 20 秒。那么这里发生了什么?

我的其他参数是 maxActive="75"、minIdle="5"、maxIdle="5"、initialSize="3"、validationQuery="SELECT 1" 和 testWhileIdle="true"。我应该澄清一下,当表被锁定时,所有这些连接都保持活动状态(没有一个再次空闲,也没有一个从池中删除)。

编辑:更正。实际上,第一个连接正在被删除,而不是后续的连接。当“suspectTimeout”设置为 20 且“removeAbandoned”设置为 false 时,“logAbandoned”正确显示所有可疑连接。

4

0 回答 0