何时验证连接池中的连接?

时间:2009-07-16 13:41:40

标签: java concurrency

我正在用Java实现连接池(即java.sql.Connection s池)。我什么时候应该检查连接是否仍然有效?在借给他们之前我不想这样做。他们回来后我应该这样做吗?每次?有一种聪明的方式来安排检查吗?

5 个答案:

答案 0 :(得分:3)

我认为您的问题的答案取决于您想要在连接池中投入多少精力。

简单的方法是执行您不想做的事情,即在请求时检查连接,我希望因为您不希望在创建新连接时延迟请求线程。

您可以拥有一个后台线程来测试连接并根据需要重新创建它们。 我认为你应该在返回之前进行测试,如果它已经死了,那么从池中抓取另一个并安排一个新连接来替换它。

我认为你正在编写自己的,因为有许多非常好的开源池可以使用 雅加达DBCP& C3P0还有更多

肖恩

答案 1 :(得分:1)

有一个监视线程,确保在池中X秒后不使用,发出一个虚拟请求(心跳),如“从双重选择1”与oracle。这应该让他们活着。

答案 2 :(得分:0)

这会受到连接池的繁忙和充分利用的影响吗?我猜这两个约束应该得到满足 -

  1. 永远不会向客户提供无效的连接对象
  2. 不要花费大量时间来提供连接(即当他们在门口要求借用连接时不要开始建立连接)。
  3. 因此,一些热情程度是好的,如果您的使用模式说频繁设置和拆卸(从客户端的角度来看),您将需要一个急切的算法。

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

    新的连接请求 - 检查有效性(可能是多余的)。如果池已完全使用或超过阈值,则将新连接置备到池中(即,如果需要,则展开)。

    关闭连接请求时 - 检查已关闭的连接是否有效,如果需要,请补充池。

    您的算法可能会比以上更加热切,当然也可以根据您的具体需求而定。

答案 3 :(得分:0)

只有在获得有关将使用多少连接以及系统可以处理的连接数量的指标后,才能给出答案。

拥有这些指标,您可以决定检查和尝试释放某些资源的最佳时间。

答案 4 :(得分:0)

任何时候连接都可能“变坏”。因此,无论何时检查连接,即使在从池中分发之前检查它,也总是存在用户尝试使用错误连接的可能性。

我所参与的连接池项目选择通过不处理它来处理这种不确定性。他们假设池中的连接是好的,除非他们有其他具体证据,这意味着从连接的用户流回某种异常。

可以知道某些类型的错误和异常意味着池中的每个连接现在都已失效。

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

但是,我建议你让每个特例在需要的时候决定解决方案。