java中的连接池

问题描述 投票:0回答:2

我需要在Java中创建一个自定义连接池,这样如果用户请求连接并在使用后返回到池,但他可以通过将连接分配给某个变量来维护对连接的引用。

由于他已将连接返回到池中,我可以将其提供给任何其他用户。现在两个用户将拥有相同的连接对象,这是错误的。

如何创建连接池来避免这种情况?

这个问题是在采访中问到的。我知道有许多库可以提供此功能,但是它们在内部如何实现此功能。

java concurrency pool
2个回答
0
投票

看起来您正在描述 UCP(通用连接池)的一项称为连接标签的功能。您可能想查看doc


0
投票

您希望确保返回连接的人无法再控制它,以便 ConnectionPool 可以安全地将连接提供给其他人。

解决方案是永远不要分发连接。相反,ConnectionPool 会生成一个看起来像连接的代理对象。实际上,代理只是将所有调用转发到真实连接。如果“代理”返回到池中,ConnectionPool 只会使其无效,因此不再转发任何请求,因此引用对于借用者来说变得毫无意义。

这种模式还有另一个优点:想象一下,借用者忘记归还连接,但最终被垃圾收集了。 ConnectionPool 将永远等待连接回来。现在,如果代理被垃圾收集,它仍然可以告诉 ConnectionPool 这一事实,并且 ConnectionPool 会使其无效,因为知道真正的连接可再次用于进一步使用。

您可以使用一个通用的 ConnectionPool 实现: https://commons.apache.org/proper/commons-pool/ 查看此包中的代理实现:https://javadoc.io/doc/org.apache.commons/commons-pool2/latest/org/apache/commons/pool2/proxy/package-summary.html

© www.soinside.com 2019 - 2024. All rights reserved.