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

时间:2008-08-26 16:53:54

标签: database resources database-connection

关于 PHP 中的单身人士的讨论让我越来越多地思考这个问题。大多数人都指示你不应该在一个请求中建立一堆数据库连接,而我只是好奇你的推理是什么。我的第一个想法是你的脚本向DB提出了很多请求的费用,但后来我反驳了这个问题:多个连接会不会使并发查询更有效率?

一些知情人士的答案(有证据,有人)怎么样?

5 个答案:

答案 0 :(得分:6)

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

此外,除非数据库服务器上的资源处于空闲状态,否则在数据库中丢弃大量额外连接并没有任何帮助。如果你有8个内核,只有一个用于满足查询,那么确定,建立另一个连接可能有所帮助。但是,更有可能的是,您已经在使用所有可用的核心。您也可能针对每个数据库请求使用相同的硬盘驱动器,并添加额外的锁争用。

如果您的数据库具有类似高利用率的任何内容,则添加额外的连接将无济于事。这就像在应用程序中产生额外的线程一样,盲目地希望额外的并发性能使处理更快。在某些情况下它可能,但在其他情况下,它只会让您在摔倒硬盘时放慢速度,浪费时间任务切换,并引入同步开销。

答案 1 :(得分:3)

设置连接,传输数据然后将其拆除是成本。它会耗尽你的表现。

证据越来越难以考虑以下......

假设连接需要x微秒。

现在您想要发出多个请求并来回获取数据。假设一个连接和许多连接之间的传输时间差异是可以忽略的(仅仅是为了参数)。

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

打开一个连接将花费x + y微秒的开销。打开很多将采用n *(x + y)。这将延迟你的执行。

答案 2 :(得分:2)

建立数据库连接通常非常繁重。很多事情都在后台(DNS解析/ TCP连接/握手/身份验证/实际查询)

我曾经遇到一个问题,一些奇怪的DNS配置使每个TCP连接在上升前花了几秒钟。我的登录过程(由于复杂的体系结构)需要3个不同的DB连接才能完成。有了这个问题,登录就需要永远。然后我们重构代码,使其仅通过一个连接。

答案 3 :(得分:1)

我们从.NET访问Informix并使用多个连接。除非我们在每个连接上启动事务,否则通常在连接池中处理。我知道这是特定于品牌的,但大多数(?)数据库系统的无提示访问将最大限度地集中连接。

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

答案 4 :(得分:0)

我认为这是因为您的请求不是异步发送的,因为您的请求是在服务器上迭代完成的,每次阻塞,您必须支付每次创建连接的开销,当您只有做一次......

在Flex中,所有Web服务调用都会自动异步调用,因此您可以在同一连接上查看多个连接或排队请求。

异步请求通过更快的请求/响应时间来降低连接成本...因为您无法在没有某些线程的情况下轻松在PHP中实现此功能,那么性能损失就会大于重复使用相同的连接。

那是我的2美分......