Tomcat JDBC连接池:testOnBorrow vs testWhileIdle

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat JDBC连接池:testOnBorrow vs testWhileIdle相关的知识,希望对你有一定的参考价值。

由于各种原因,池中的连接可能变为无效:服务器连接超时,网络问题......

我的理解是Tomcat JDBC连接池不保证它为应用程序提供的连接的有效性。

为了防止(实际上只降低风险)从池中获得无效连接,解决方案似乎是连接验证的配置。验证连接意味着在数据库上运行非常基本的查询(例如mysql上的SELECT 1;)。

Tomcat JDBC连接池提供了几个测试连接的选项。我发现更有趣的两个是testOnBorrowtestWhileIdle

首先我认为testOnBorrow是最好的选择,因为它在将它提供给应用程序之前基本上验证了连接(最大频率由validationInterval定义)。

但是经过一秒钟后我才意识到在使用它之前测试连接可能会影响应用程序的响应能力。所以我虽然使用testWhileIdle可以更高效,因为它在不使用时测试连接。

无论我选择哪个选项,它们似乎只会降低获得无效连接的风险,但这种风险仍然存在。

所以我最后问:我应该使用testOnBorrowtestWhileIdle还是两者兼而有之?

在旁注,我很惊讶validationInterval不适用于testOnReturn而且我真的没有达到testOnConnect的目的。

答案

这没有100%正确的答案。这是一个权衡和背景的问题。

  • 大多数情况下,testOnBorrow风险最小,因为它确保(尽可能最好)在从池中返回连接供您使用之前,已经进行了基本的健全性检查,客户端和数据库服务器正在谈论条款。
  • 它仍然不能防止服务器连接的竞争状态下降,在“完整性检查”和应用程序使用连接的时间之间。
  • 但考虑到这是一个角落案例,testOnBorrow给出了相当不错的保证。
  • 现在需要权衡的是,每次请求连接时,都会对数据库服务器进行查询(无论多么轻量级)。这可能非常快,但成本仍然不是零。

如果你有一个繁忙的应用程序,具有非常好的数据库连接可靠性,那么你将从数据开始看到,“对来自池的每个连接请求的有效性检查”的成本超过检测连接问题的好处。

  • 另一方面,如果您的应用程序不是一成不变的(就像大多数真实应用程序一样),那么拥有testOnBorrow选项是非常有益的。
  • 它确保最大化,您在使用之前有良好的连接。特别是考虑到失败的DB操作的“无法轻松恢复”的成本(重试+手动干预+工作流程丢失等)。
  • 现在想象一下,如果你有testOnIdle选项。这需要您的连接在进行健全性检查之前空闲(取决于连接的空闲超时)。
  • 这是testOnBorrow的性能改进,但它有其自身的缺点。 真实世界的app-to-db-connections不仅仅是基于空闲超时的破坏,它们可以根据防火墙规则,n / w拥塞,db-server-正在进行维护/修补等而被删除。 因此,当您没有任何类型的“连接验证”时,它可以追溯到数据中观察到的连接错误数量的数据测量。
  • 使用此选项需要注意的一件事是,当您使用最大连接并且您的应用程序运行良好时,您的池工作效果最佳,并且出于某种原因,如果您的数据库服务器重启或同样如此。现在所有的实时连接(从客户端的角度来看)都会出错,直到空闲超时开始。所以你的db-issue(这本来就是一场激烈的争夺)现在有点复杂,直到应用程序连接恢复正常或你重启应用程序。

最后一个数据点是,对于某些应用程序,关键路径不是“验证查询”时间(希望以较低的毫秒数)。应用程序有更大的问题需要处理。当然,对于某些应用来说,那个时间非常重要。

另一答案

只是为了让你知道,我刚刚对此进行了测试,可以同时使用testOnBorrowtestOnIdle属性。

然而,如上所述,我将选择testOnBorrow,因为我的应用程序没有大量流量,并且能够在握住它之前验证连接。

正如评论中指出的那样,testOnBorrow不需要验证查询。如果你确实选择保留一个它可以是一个简单的选择:

jdbc.hive.testOnBorrow=true
jdbc.hive.validationQuery=SELECT 1

如果您想使用testWhileIdle,您可以使用以下内容:

jdbc.testWhileIdle=true
jdbc.minEvictableIdleTimeMillis=1800000
jdbc.timeBetweenEvictionRunsMillis=1800000`

有关DBCP的更多信息:https://commons.apache.org/proper/commons-dbcp/configuration.html

以上是关于Tomcat JDBC连接池:testOnBorrow vs testWhileIdle的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot (11) tomcat jdbc连接池

如何记录 Tomcat 7 JDBC 连接池、连接创建

测试 Tomcat 的 JDBC 池连接

Tomcat 和 JDBC 连接池

tomcat 7 jdbc连接池和jdbc4验证

如何在 Spring/Tomcat 中完全禁用 JDBC 连接池?