PDO中使用持久连接有什么缺点

2024-07-04

在 PDO 中,可以使用以下方法使连接持久化PDO::ATTR_PERSISTENT属性。根据 php 手册 -

持久连接不会在脚本结束时关闭,而是 当另一个脚本请求连接时,会被缓存并重新使用 相同的凭据。持久连接缓存允许您 避免每次建立新连接的开销 脚本需要与数据库对话,从而获得更快的网络速度 应用。

该手册还建议在使用 PDO ODBC 驱动程序时不要使用持久连接,因为它可能会妨碍 ODBC 连接池过程。

显然,除了最后一种情况之外,在 PDO 中使用持久连接似乎没有任何缺点。但是,我想知道使用这种机制是否还有其他缺点,即这种机制会导致性能下降或类似的情况。


请务必阅读下面这个答案 https://stackoverflow.com/a/11454173/168868,其中详细介绍了缓解此处列出的问题的方法。


与任何其他执行持久连接的 PHP 数据库接口一样,使用 PDO 也存在同样的缺点:如果您的脚本在数据库操作过程中意外终止,则获取剩余连接的下一个请求将从失效脚本​​停止的位置继续。连接在进程管理器级别(Apache for mod_php,当前的 FastCGI 进程,如果您使用 FastCGI 等)保持打开状态,而不是在 PHP 级别,并且 PHP 不会告诉父进程让连接在以下情况终止:脚本异常终止。

如果死脚本锁定了表,则这些表将保持锁定状态,直到连接终止或获取连接的下一个脚本本身解锁表。

如果死脚本位于事务中间,则可能会阻塞多个表,直到死锁计时器启动为止,即使如此,死锁计时器也可以杀死较新的请求,而不是导致问题的较旧的请求。

如果失效脚本处于事务中间,则获取该连接的下一个脚本也会获取事务状态。很可能(取决于您的应用程序设计)下一个脚本实际上可能不会尝试提交现有事务,或者在不应该提交的时候提交,或者在不应该提交的时候回滚。

这只是冰山一角。通过在每个脚本请求的脏连接后始终尝试清理,可以在一定程度上缓解这种情况,但这可能会很痛苦,具体取决于数据库。除非您已确定创建数据库连接为瓶颈的一件事在你的脚本中(这意味着你已经使用xdebug http://www.xdebug.org/ and/or xhprof http://pecl.php.net/package/xhprof), 你应该not将持久连接视为解决任何问题的方法。

此外,大多数现代数据库(包括 PostgreSQL)都有自己首选的执行连接池的方法,这些方法没有普通的基于 PHP 的持久连接所具有的直接缺点。


为了澄清一点,我们在工作场所使用持久连接,但不是出于选择。我们当时遇到的是weird连接行为,从我们的应用程序服务器到数据库服务器的初始连接正在进行exactly三秒钟,而本应该只需要零点几秒。我们认为这是一个内核错误。我们放弃尝试对其进行故障排除,因为它是随机发生的,无法按需重现,而且我们的外包 IT 没有具体的能力来追踪它。

无论如何,当仓库里的人正在处理几百个传入的零件,并且每个零件需要三秒半而不是半秒时,我们必须在他们绑架我们所有人并让我们帮助他们之前采取行动。因此,我们对我们自己开发的 ERP/CRM/CMS 怪物进行了一些修改,并亲身体验了持久连接的所有可怕之处。我们花了weeks追踪所有看似随机发生的微妙小问题和奇怪行为。事实证明,我们的用户努力从我们的应用程序中挤出的那些每周一次的致命错误导致了锁定的表、放弃的交易和其他不幸的不稳定状态。

这个悲伤的故事有一个道理:它以性能的名义打破了我们从未想过会打破的东西。这种权衡是不值得的,我们热切地等待着有一天我们可以切换回正常连接而不会引起用户的骚乱。

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

PDO中使用持久连接有什么缺点 的相关文章

  • GUI MySQL 数据库前端[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我对一款软件有一个有点绝望的愿望清单 但我不知道它是否存在 它需要什么 免费使用 在小型企业中 在带有
  • 当我访问不存在路由的类时,如何在codeIgniter中设置默认函数?

    控制器是这样的 class Abc extends CI controller public function index public function f1 如果网址是http host app Abc index它得到函数索引如果网址
  • 用于 LIKE 时 MySqli 准备语句错误

    我正在尝试使用 php 的 mysqli 扩展为 LIKE 查询制作准备好的语句 但无论我尝试什么 我总是会收到此错误 Fatal error Problem preparing query SELECT f r slug FROM foo
  • PHP 字符串中的 JavaScript 数组

    我正在开发一个具有数千个值的应用程序 我正在尝试用 JavaScript 创建一个动态数组 我正在使用 AJAX 来获取我的值 所以我必须从 PHP 创建一个字符串 它应该能够在 JavaScript 中从字符串转换为数组 如何在 PHP
  • mysql_query("从表 WHERE id-'$id' 中删除");失败[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试通过 PHP 从 mySQL 数据库中删除一行 但它不起作用 我已经尝试过以下方法 mysql query DELETE
  • 调整大小然后裁剪 PHP

    好的 基本上我希望所有图像都是 170x170px 的正方形 因此 如果图像不是正方形 我希望调整它的大小 然后在中间裁剪 我花了很多时间玩这个 但一无所获 我已经让它裁剪较大图像的一部分等 但我特别需要调整图像大小 然后裁剪 任何帮助将不
  • 如何使用 PHP 获取当前年份?

    我想在网站的页脚中放置版权声明 但我认为它对于今年来说已经过时了 非常俗气 我如何使用 PHP 自动更新年份 Answer recommended by PHP collectives php Collective 您可以使用date ht
  • 在 PHP 中组合数组

    尝试学习 PHP 中的数组 为简洁起见 发布了片段 HTML 表单在这里 p What are your favorite type of cookies p
  • Zend Framework 2 SOAP AutoDiscover 和复杂类型

    我正在准备 SOAP 服务器并使用以下代码生成 WSDL Controller action code if key exists wsdl params autodiscover new AutoDiscover autodiscover
  • 未找到特征“Venturecraft\Revisionable\RevisionableTrait”

    我正在使用 laravel 4 我想跟踪对表进行的所有交易的历史记录 我按照这些步骤操作 added venturecraft revisionable 1 在作曲家 json php composer phar update 在我的项目的
  • 将 PHP 转换为数组并循环

    我正在为我们的空手道学校开发一个应用程序 希望从数据库中获取技术名称 将它们以随机顺序存储在一个数组中 并且能够单击一个按钮一次在整个数组中移动 我以几种不同的方式考虑过这个问题 包括从数据库中随机进行 这非常简单 但它多次提取相同的技术
  • 将 3 个具有透明度的图像组合在一起

    我正在做这个项目 我想将三张图像合并为一张 到目前为止 有效的方法是使每个图像 jpg 透明 但将它们合并成新的 png 图像后 透明度就消失了 这是代码 function CreateMyCoolOutfitBaby Outfitwidt
  • php curl 获取 html 和 js 渲染

    php curl 只获取html页面的源代码 不执行js脚本 我需要我的网站获取已执行所有 JavaScript 的源代码 我使用ajax 但无法在页面中添加更多js 因为当我加载另一个页面时脚本会保留 我找到了 SpiderMonkey
  • Node.js如何重现PHP MD5加密

    我正在将现有的基于 php 的网站转换为 node js 应用程序 并且我需要将这种加密方法从 php 复制到 js private static passwordSalt d2g6IOP U U VUIPU HN V URerjh0 rf
  • 从php中的csv文件读取大数据[重复]

    这个问题在这里已经有答案了 我正在读取 csv 并使用 mysql 检查记录是否存在于我的表中或不存在于 php 中 csv 有近 25000 条记录 当我运行代码时 它在 2m 10 秒后显示 服务不可用 错误 加载 2m 10 秒 这里
  • AJAX 调用后使用 jquery 刷新 DOM

    我正在做一个新项目http www hotwirerevealed com http www hotwirerevealed com它显示 识别 hotwire com 上的酒店 输入状态和目的地后 我有一个 javascript 函数 它
  • 双因素认证系统

    我正在尝试使用 SMS 作为第二种身份验证方法来设计一个双因素身份验证系统 在 PHP 上 这是一个测试项目 任何人都可以帮助我设计这项服务吗 这将是一个基于网络的系统 下面是我到目前为止所做的 客户端输入用户名和密码后 网站将向我们的服务
  • PHP:如何使图像中的绿色区域(背景)透明?

    我是 Stackoverflow 的新人 我非常想弄清楚是否可以使用 PHP 脚本使图像的特定颜色透明 如果是的话 该如何去做呢 假设这是背景颜色 绿色 必须完全透明的图像 法国热狗带绿色背景 http clubace dk hotdog1
  • Zend 框架表单与 jquery

    有人知道如何使用 Zend Form 和 jquery 简单地创建一个表单吗 我想使用 Zend Form 来验证表单 这样我就不必在 JavaScript 和 PHP 中编写表单的双重脚本 谢谢你 伊沃 特罗姆伯特 那里没问题 如果您使用
  • 与数据库同步的基于 PHP 的数据库模型?

    Django 模型真的很酷 因为您可以在代码中定义所有模型 表 然后将其与数据库同步 这样 当您去更新生产服务器时 您只需运行迁移 同步脚本 并且不会忘记更新任何表 我现在正在从事的项目不是基于 Django 或 Python 而是用 PH

随机推荐