由于各种原因,池中的连接可能会变得无效:服务器连接超时、网络问题......
我的理解是,Tomcat JDBC 连接池不对其向应用程序提供的连接的有效性提供任何保证。
为了防止(实际上只是降低风险)从池中获取无效连接,解决方案似乎是配置连接验证。验证连接意味着在数据库上运行一个非常基本的查询(例如SELECT 1;
在 MySQL 上)。
Tomcat JDBC 连接池提供了多种测试连接的选项。我觉得比较有趣的两个是testOnBorrow
and testWhileIdle
.
首先我在想testOnBorrow
是最好的选择,因为它基本上在将连接提供给应用程序之前验证连接(最大频率由validationInterval
).
但过了一会儿,我意识到在使用之前测试连接可能会影响应用程序的响应能力。所以我认为使用testWhileIdle
可以更有效,因为它可以在不使用连接时测试连接。
无论我选择哪个选项,它们似乎都只会降低获得无效连接的风险,但这种风险仍然存在。
所以我最后问:我应该使用testOnBorrow
or testWhileIdle
或者两者的混合?
顺便说一句,我很惊讶validationInterval
不适用于testOnReturn
我真的不明白这样做的目的testOnConnect
.
这个问题没有 100% 正确的答案。这是一个权衡和背景的问题。
如果您有一个繁忙的应用程序,并且具有非常好的数据库连接可靠性,那么您将从数据中开始看到,“对池中每个连接请求进行有效性检查”的成本超过了检测连接问题的好处。
最后一个数据点是,对于某些应用程序,关键路径不是“验证查询”时间(希望以较低的毫秒为单位)。应用程序有更大的问题需要处理。当然,对于某些应用程序来说,这段时间非常重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)