我有一个项目,其中我使用HikariCP
进行JDBC连接池。 HikariCP非常适合我的需求。它还会记录池的统计信息,如下所示。
2014-12-03 10:16:08 DEBUG HikariPool:559 - Before cleanup pool stats loginPool (total=8, inUse=0, avail=8, waiting=0)
2014-12-03 10:16:08 DEBUG HikariPool:559 - After cleanup pool stats loginPool (total=7, inUse=1, avail=7, waiting=0)
出于实验目的,我使用MySQL
关闭了已配置数据库的所有MySQL Workbench
连接。但是,我仍然看到HikariCP
像以前一样记录统计数据,尽管没有与数据库的实际连接。当有连接请求时,它立即建立连接(初始8),所以一切都很好。
所以,我的问题是如何管理或实施这些连接?我认为HikariCP
记录统计信息的原因,就好像存在连接一样,是因为它在内存中对连接有效,实际上不存在(使用数据库)。
我的理解是否正确?
答案 0 :(得分:1)
连接池在启动时创建了8个连接。你说你使用工作台断开了它们。大多数连接池在使用之前都不知道连接已断开连接。
你的假设是正确的。您手动终止了连接,但池有一个8个套接字的句柄,它假设已连接。给定时间您的连接池可能已检查连接的有效性并尝试重新连接它们。我无法代表HikariCP,但这就是现代连接池的作用。
答案 1 :(得分:1)
使用MySQL Workbench关闭连接时,您将在服务器端关闭它们。在JDBC(客户端)端,先前建立的连接将保持存在,直到客户端代码尝试使用它们。那时,他们将被发现“被打破”;即客户端在尝试使用它们时会遇到异常。
客户端JDBC Connection对象只有在Java应用程序代码返回到连接池时才会被关闭或回收。