代码之家  ›  专栏  ›  技术社区  ›  sergtk

为什么在一个请求中建立多个数据库连接是一种坏做法?

  •  1
  • sergtk  · 技术社区  · 17 年前

    关于独生子的讨论 PHP 让我越来越多地思考这个问题。大多数人都会说你不应该在一个请求中进行大量的DB连接,我只是好奇你的推理是什么。我的第一个想法是花掉你的脚本向数据库发出那么多请求的费用,但是我用一个问题来反驳自己:多个连接是否会使并发查询更有效?

    一些知情人士的回答(有证据的,伙计们)如何?

    5 回复  |  直到 17 年前
        1
  •  6
  •   Derek Park    17 年前

    数据库连接是有限的资源。一些DBS的连接限制非常低,浪费连接是一个主要问题。通过使用许多连接,您可能会阻止其他人使用数据库。

    此外,在数据库上抛出大量额外的连接没有任何帮助,除非数据库服务器上有空闲的资源。如果您有8个内核,并且只有一个用于满足查询,那么当然,建立另一个连接可能会有所帮助。更可能的是,您已经使用了所有可用的核心。对于每个DB请求,您也可能访问相同的硬盘驱动器,并添加额外的锁争用。

    如果您的数据库有类似于高利用率的东西,那么添加额外的连接将没有帮助。这就像在应用程序中产生额外的线程一样,盲目地希望额外的并发性能够使处理更快。它 可以 在某些特定的情况下,但在其他情况下,它只会减慢您的速度,因为您需要反复敲打硬盘,浪费时间进行任务切换,并引入同步开销。

        2
  •  3
  •   Craig    17 年前

    这是建立连接、传输数据然后将其拆掉的成本。它会毁掉你的表演。

    很难找到证据,但要考虑以下几点…

    假设连接需要x微秒。

    现在,您需要发出几个请求,并来回获取数据。假设传输时间的差异在一个连接和多个连接之间是可以消除的(只是为了争论)。

    现在假设关闭连接需要Y微秒。

    打开一个连接将需要X+Y微秒的开销。打开多个需要n*(x+y)。那会耽误你的执行。

        3
  •  2
  •   Vincent    17 年前

    建立DB连接通常很重。很多事情都发生在后台 (DNS解析/TCP连接/握手/身份验证/实际查询) .

    我曾经遇到过一个关于一些奇怪的DNS配置的问题,使得每个TCP连接在启动前都需要几秒钟的时间。我的登录过程(由于架构复杂)需要3个不同的数据库连接才能完成。有了这个问题,登录需要花费很长时间。然后我们重构代码,使其只通过一个连接。

        4
  •  1
  •   hometoast    17 年前

    我们从.NET访问Informix并使用多个连接。除非我们在每个连接上启动一个事务,否则它通常在连接池中处理。我知道这是非常具体的品牌,但大多数(?)数据库系统的客户端访问将尽其所能地汇集连接。

    顺便说一句,由于跨数据库连接,我们确实在连接计数方面遇到了问题。Informix支持同义词,因此我们同义了常见的违规者,并且服务器端处理了多个连接,从而节省了大量的传输时间、连接创建开销和(我们所处位置的真正症结)许可费。

        5
  •  0
  •   mmattax    17 年前

    我假设这是因为您的请求没有被异步发送,因为您的请求是在服务器上迭代完成的,每次都被阻塞,所以您必须支付每次创建连接的开销,而您只需要执行一次…

    在flex中,所有Web服务调用都是自动异步调用的,因此在同一个连接上经常会看到多个连接或排队请求。

    异步请求通过更快的请求/响应时间来降低连接成本…因为您不能 容易地 在PHP中实现这一点而不需要一些线程,那么性能上的影响会更大,然后简单地重用相同的连接。

    那是我的2美分…

    推荐文章