在连接池中,什么时候进行连接验证?

3

我正在Java中实现连接池(即java.sql.Connection的池)。 我应该在什么时候检查连接是否仍然有效? 我不想在借出它们之前这样做。 我应该在归还它们时进行检查吗? 每次都检查吗? 是否有一种聪明的方法来安排检查?

5个回答

3
我认为你的问题的答案取决于你想要花多少精力来管理连接池。
简单的方法是做你不想做的事情,即在请求连接时检查连接,我猜想是因为你不想在创建新连接时延迟请求线程。
你可以有一个后台线程来测试连接并根据需要重新创建它们。我认为你应该在返回连接之前始终进行测试,如果连接失效,则从池中获取另一个并安排新连接替换它。
我理解你自己编写代码有充分的理由,因为有很多非常好的开源连接池可供使用,例如Jakarta DBCP和C3P0等。
Shawn

+1 对于“你为什么要自己做这个”的问题。至少,可以从一个开源项目开始,并根据需要进行调整。 - Kevin Day

1

有一个监视线程,确保在池中未被使用X秒后,发出一个虚拟请求(心跳),例如使用Oracle的"select 1 from dual"。这应该使它们保持活动状态。


0

连接随时可能“失效”。因此,无论何时检查连接,即使在从池中分配之前进行检查,用户仍有可能尝试使用错误的连接。

我参与过的连接池项目选择不处理这种不确定性。他们假设池中的连接是好的,除非他们有确凿的证据表明相反,也就是说,某种异常从连接的用户那里返回。

某些类型的错误和异常可能意味着池中的每个连接现在都无效。

我见过一些特殊情况的环境,这种方法并不理想。在这些情况下,可以使用其他解决方案。例如,也许您的程序为池化连接的服务器每天早上2点重新启动。在这种情况下,计时器可以在服务器重新启动后每天运行一次(也许是在3点),测试并可能使池中的所有连接无效。

然而,我建议您让每个特殊情况决定所需的解决方案。


0

这会受到连接池的繁忙程度和充分利用程度的影响吗?我猜应该满足以下两个约束条件:

  1. 永远不要向客户端提供无效的连接对象
  2. 不要花费大量时间来提供连接(即当他们在门口借用连接时,不要开始设置连接)。

因此,一定程度上的渴望是好的,如果您的使用模式表明需要频繁设置和拆除(从客户端的角度),则需要有一个渴望的算法。

当然,您可以锚定两个事件:1)新连接请求2)关闭连接请求。

在新连接请求时-检查有效性(可能是冗余的)。如果池已满或超过阈值,则将新连接提供给池(即根据需要扩展)。

在关闭连接请求时-检查关闭的连接的有效性,如有必要,请补充池。

根据您的特定需求,您的算法可能比上述更渴望。


0

只有在获取了有关将使用多少连接以及您的系统可以处理多少连接的一些指标后,才应该给出答案。

有了这些指标,您可以决定何时是检查并尝试释放一些资源的最佳时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接