繁体   English   中英

JDBC连接如何实现?

[英]How are JDBC connections implemented?

我有一个项目,在其中使用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 Workbench关闭了已配置数据库的所有MySQL连接。 但是,尽管没有到数据库的实际连接,我仍然看到HikariCP像以前一样记录了统计信息。 当有连接请求时,它立即建立了连接(初始8),因此一切正常。

因此,我的问题是如何管理或实现这些连接? 我认为HikariCP记录统计数据(好像有连接)的原因是因为它在内存中具有对连接的有效引用,而这些连接实际上是不存在的(使用数据库)。

我的理解正确吗?

连接池在启动时创建了8个连接。 您说您使用工作台断开了它们的连接。 大多数连接池在使用之前都不知道连接已断开。

您的假设是正确的。 您手动终止了连接,但是该池有一个假定已连接的8个套接字的句柄。 给定时间,您的连接池可能已经检查了连接的有效性,并试图重新连接它们。 我不能代表HikariCP,但这就是现代连接池的作用。

当使用MySQL Workbench关闭连接时,就是在服务器端关闭它们。 在JDBC(客户端)端,以前建立的连接将一直存在,直到客户端代码尝试使用它们为止。 到那时,它们会被发现“损坏”; 即客户端尝试使用它们时将获得异常。

客户端JDBC连接对象仅在Java应用程序代码将它们返回到连接池时才关闭或回收。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM