我正在Java中实现连接池(即java.sql.Connection
的池)。 我应该在什么时候检查连接是否仍然有效? 我不想在借出它们之前这样做。 我应该在归还它们时进行检查吗? 每次都检查吗? 是否有一种聪明的方法来安排检查?
我正在Java中实现连接池(即java.sql.Connection
的池)。 我应该在什么时候检查连接是否仍然有效? 我不想在借出它们之前这样做。 我应该在归还它们时进行检查吗? 每次都检查吗? 是否有一种聪明的方法来安排检查?
有一个监视线程,确保在池中未被使用X秒后,发出一个虚拟请求(心跳),例如使用Oracle的"select 1 from dual"。这应该使它们保持活动状态。
连接随时可能“失效”。因此,无论何时检查连接,即使在从池中分配之前进行检查,用户仍有可能尝试使用错误的连接。
我参与过的连接池项目选择不处理这种不确定性。他们假设池中的连接是好的,除非他们有确凿的证据表明相反,也就是说,某种异常从连接的用户那里返回。
某些类型的错误和异常可能意味着池中的每个连接现在都无效。
我见过一些特殊情况的环境,这种方法并不理想。在这些情况下,可以使用其他解决方案。例如,也许您的程序为池化连接的服务器每天早上2点重新启动。在这种情况下,计时器可以在服务器重新启动后每天运行一次(也许是在3点),测试并可能使池中的所有连接无效。
然而,我建议您让每个特殊情况决定所需的解决方案。
这会受到连接池的繁忙程度和充分利用程度的影响吗?我猜应该满足以下两个约束条件:
因此,一定程度上的渴望是好的,如果您的使用模式表明需要频繁设置和拆除(从客户端的角度),则需要有一个渴望的算法。
当然,您可以锚定两个事件:1)新连接请求2)关闭连接请求。
在新连接请求时-检查有效性(可能是冗余的)。如果池已满或超过阈值,则将新连接提供给池(即根据需要扩展)。
在关闭连接请求时-检查关闭的连接的有效性,如有必要,请补充池。
根据您的特定需求,您的算法可能比上述更渴望。
只有在获取了有关将使用多少连接以及您的系统可以处理多少连接的一些指标后,才应该给出答案。
有了这些指标,您可以决定何时是检查并尝试释放一些资源的最佳时间。