Tomcat JDBC 连接池:testOnBorrow 与 testWhileIdle

2024-02-12

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

我的理解是,Tomcat JDBC 连接池不对其向应用程序提供的连接的有效性提供任何保证。

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

Tomcat JDBC 连接池提供了多种测试连接的选项。我觉得比较有趣的两个是testOnBorrow and testWhileIdle.

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

但过了一会儿,我意识到在使用之前测试连接可能会影响应用程序的响应能力。所以我认为使用testWhileIdle可以更有效,因为它可以在不使用连接时测试连接。

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

所以我最后问:我应该使用testOnBorrow or testWhileIdle或者两者的混合?

顺便说一句,我很惊讶validationInterval不适用于testOnReturn我真的不明白这样做的目的testOnConnect.


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

  • 大部分的时间,借用测试风险最小,因为它确保(尽可能)在从池中返回连接供您使用之前,已进行基本的健全性检查以确保客户端和数据库服务器处于正常状态。
  • 它仍然无法阻止在进行“健全性检查”的时间和应用程序使用连接的时间之间服务器连接的竞争条件下降。
  • 但考虑到这是一个极端情况,借用测试提供了很好的保证。

  • 现在的权衡是,每次请求连接时,都会对数据库服务器进行查询(无论多么轻量级)。这也许很快,但成本仍然不为零。

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

  • 另一方面,如果您的应用程序并不总是繁忙(像大多数现实世界的应用程序一样),那么拥有借用测试选项。
  • 它最大限度地确保您在使用之前拥有良好的连接。特别是考虑到从失败的数据库操作中“无法轻松恢复”的成本(重试+手动干预+工作流程损失等)。

  • 现在想象一下如果你有空闲测试选项。这要求您的连接在进行健全性检查之前处于空闲状态(取决于连接的空闲超时)。

  • This is a performance improvement over testOnBorrow but it comes with its own disadvantages.
    • 现实世界中的应用程序到数据库的连接不仅仅是基于空闲超时的破坏,它们还可以根据防火墙规则、网络拥塞、数据库服务器正在进行维护/修补等而被删除。
    • 因此,当您没有任何类型的“连接验证”时,它又回到了数据测量,即在数据中观察到了多少连接错误。
  • 使用此选项需要注意的一件事是,当您的池在最大连接数下工作得最好并且您的应用程序性能良好时,并且由于某种原因您的数据库服务器经历了重新启动或类似情况。所有实时连接(从客户端角度来看)现在大部分都会出错,直到空闲超时开始。因此,您的数据库问题(这本来是一场交火)现在变得有点复杂,直到应用程序连接再次恢复正常或者您也重新启动应用程序。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tomcat JDBC 连接池:testOnBorrow 与 testWhileIdle 的相关文章

随机推荐

  • 如何恢复 Android 应用程序的默认区域设置

    我有这个 Android 应用程序 已本地化为多种语言 如果存在适合设备区域设置的字符串 应用程序会自动显示它 到目前为止 一切都很好 接下来 我想允许应用程序的用户切换到我提供的其中一种语言 我可以通过覆盖默认区域设置来做到这一点 这里也
  • 如何知道 Xcode 中是否触摸了 .png 的唯一可见区域

    我已将 png 图像导入到UIImageView在 Xcode 中 我想要做的是当触摸图像时 它将被隐藏 但我的问题是 png 图像包含透明部分 当我触摸透明部分时 动作会继续 我希望仅当图像的可见部分被触摸时动作才继续 如何解决问题 Sw
  • 在 CSP 中不使用“unsafe-eval”的 Vuejs 浏览器扩展

    我使用 Vuejs 构建了一个浏览器插件 并使用 Laravel Mix 作为我的构建过程 我的所有 vue 模板都在单个文件组件中 一切都工作得很好 直到我从插件清单中的 CSP 中删除 unsafe eval 火狐浏览器显示错误 Con
  • 从 Lua 中的(最简单的)函数直接返回表条目

    我想编写最简单的函数 让我在无名表中返回所需的值 并且 ideally 它应该是这样的 function RL MyTool Version n return 0 4 0 20221003 0230 13 5 5 n end 但是 当然 这
  • 在 HTML/CSS 中创建列的最佳方法

    我正在寻找一种显示 3 列内容的方法 我找到了一种显示环绕列的方法 但我不希望在该页面上使用这种方法 我正在寻找一种方式来表达
  • 导入错误:Mac 上没有名为 lxml 的模块

    我在运行 Python 脚本时遇到问题 它显示以下消息 ImportError No module named lxml 我想我必须安装一些名为 lxml 的东西 但我确实是 Python 的新手 对此我并没有太多的想法 根据我在其他线程中
  • PHP 中的自动加载器 - 一次运行两个

    我了解如何注册自动加载器 甚至如何创建自动加载器 这根本不是问题 主要问题是 如何让两个自动装载机并排运行以执行以下操作 class project one folder class extends project two folder c
  • 如何在 Java 中播放声音?

    我希望能够在我的程序中播放声音文件 我应该去哪里看 我编写了以下代码 效果很好 但我认为它只适用于 wav format public static synchronized void playSound final String url
  • OpenSSL 中 PEM 格式的默认密码是什么?

    我使用 openssl 生成密钥 证书 openssl exe req x509 days 1000 newkey rsa 1024 keyout key pem out cert pem 它提示输入密码 我猜测密码是用于密钥加密的 但是我
  • ALV网格只加载前64行,如何更改默认加载

    情况 我已经为 SAP GUI 脚本创建了一个查找功能 如果网格行在特定列中具有特定值 则双击它 这会触发加载特定的相关数据 我的网格少于 300 行 因此加载如此多的数据不会对现代计算机造成压力 Issue 我遇到的问题是 从 SAPGr
  • 从模板中的 django 表单中仅获取一个字段

    我有一种形式 class FormLogin forms Form email forms EmailField max length 150 name forms CharField max length 20 如何在模板中仅添加电子邮件
  • 注册的elephantbird仍然显示错误2998

    grunt gt register home piyush Desktop pro json simple 1 1 1 jar grunt gt register home piyush Desktop pro elephant bird
  • Netlogo中有NOOP吗?

    我正在寻找一种在 netlogo 中什么也不做的方法 在其他编程语言中 这称为无操作方法 有没有办法可以在 netlogo 中做到这一点 您可以非常轻松地编写自己的无操作过程 to no op end usage to go no op e
  • 将画布原点设置为左下角

    有没有办法将原点设置为画布的左下角 我尝试按 1 缩放 但之后一切都颠倒了 我需要制作类似坐标系的东西 但只有正部分 第一象限 所以我需要它从左下角的 0 0 开始 ctx translate 0 canvas height ctx sca
  • 任何仅忽略“连接由对等方重置”IOExceptions 的方法

    由于网络问题 我对来自套接字读取调用的大量 IOException 感到非常恼火 通常 这仅意味着有人杀死了子进程或网络严重故障 VPN 连接断开等 我的服务器无法执行任何操作 但我真的不想在日志文件中看到所有这些错误 java中有没有办法
  • 为什么张量流分类器在移动设备上的准确度低于笔记本电脑

    我使用 2 个 googleCodelabs 重新训练了自定义张量流模型 其链接如下 诗人 1 的 Tensorflow https codelabs developers google com codelabs tensorflow fo
  • 使用 WordPress $wpdb 将数据插入 WordPress 数据库中的表中

    我正在开始插件开发 并已按照 WordPress Codex 网站上的教程进行操作 我现在陷入困境 我有一个名为 wp imlisteningto 的数据库 其中wp 插入使用 table name wpdb gt prefix imlis
  • “功能”和“功能”有什么区别!在 VIM 中?

    我看到很多 函数 的用法 在其他 vimrc 文件中 但没有易于找到的 function 文档 功能 和 功能 有什么区别 help user functions 当具有此名称的函数已存在且 为未使用时会给出错误消息 当使用 时 现有功能会
  • 向 TinyMCE 文本区域添加边框半径

    是否可以为 TinyMCE 的文本区域添加边框半径 我的输入字段等上有圆角 但我无法让它在我的文本区域上工作 这有点杀了我 可能是因为 TinyMCE 将它变成了 IFRAME 有没有办法解决 多谢 一种解决方案是使用editor css设
  • Tomcat JDBC 连接池:testOnBorrow 与 testWhileIdle

    由于各种原因 池中的连接可能会变得无效 服务器连接超时 网络问题 我的理解是 Tomcat JDBC 连接池不对其向应用程序提供的连接的有效性提供任何保证 为了防止 实际上只是降低风险 从池中获取无效连接 解决方案似乎是配置连接验证 验证连