2014-12-03 51 views
0

我有一个项目,我使用HikariCP进行JDBC连接池。而HikariCP的作品非常适合我的需求。它还会记录下面的池的统计信息。JDBC连接是如何实现的?

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记录统计信息,就好像有连接一样,是因为它在内存引用中对连接有效,而连接实际上并不存在(有数据库)。

我的理解是否正确?

回答

1

当您使用MySQL Workbench关闭连接时,您将在服务器端关闭它们。在JDBC(客户端)方面,先前建立的连接将保持存在,直到客户端代码尝试使用它们。那时,他们会被发现是“破”的;即客户端在尝试使用它们时会收到异常。

客户端JDBC连接对象只有在您的Java应用程序代码返回到连接池时才会关闭或回收。

+0

只是好奇。我已经承认这个问题很广泛。但是,有没有什么资料可以用来理解Java Heap对象和外部连接之间的关系? – phoenix 2014-12-03 06:49:26

+1

MySQL Connector/J和HikariCP的源代码就是你需要的。深入研究JVM源代码不太可能告诉你任何相关的东西。 (在这个级别上,这只是映射到套接字和流上,并且不太可能有任何与您在JDBC客户端API上观察到的内容相关的“管理”)。 – 2014-12-03 06:56:42

1

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

你的假设是正确的。您手动终止了连接,但该池具有一个假定连接的8个插座的句柄。考虑到连接池可能已检查连接的有效性并尝试重新连接它们。我不能为HikariCP发言,但这是现代连接池所能做的。

+0

谢谢。但是,我主要对内部工作感兴趣。这些如何管理? – phoenix 2014-12-03 05:33:14

+0

嗯..解释“托管”?连接池的目的是从池返回的连接中抽取实际的JDBC连接。他们可以做一些事情,比如创建准备好的语句,然后尽可能在相同的连接上执行后续的语句。您的代码看到的Connection对象与实际连接之间可能没有1对1的关系,具体取决于池想要优化它们的方式。 “他们如何管理?”是一个很大的问题。 – slipperyseal 2014-12-03 06:13:48

+0

是的。我意识到我的错误。这个问题其实非常广泛。 – phoenix 2014-12-03 06:17:24