整个应用程序中的单个数据库连接?

时间:2014-11-27 03:38:02

标签: database performance

以解释语言(如PHP)编程并使用数据库(如MySQL)的Web应用程序将实例化数据库对象,并在每次处理请求时建立新连接。

使用编译二进制文件(如Go)的语言编写的Web应用程序通常会创建一个将贯穿整个过程的数据库连接,并将用于应用程序将处理的所有HTTP请求。 / p>

如果这是事实,假设性能明智是否安全,编译的程序将始终是最佳选择?

2 个答案:

答案 0 :(得分:2)

  

如果这是事实,

不是。

  

可以安全地假设性能明智,编译后的程序永远是最佳选择吗?

不,这不是语言是否编译的特征,而是与您使用的数据库API相关,或者与您自己创建的语言无关。

单个应用程序范围的连接

使用单个数据库连接的应用程序将无法利用数据库服务器上可用的并行性,并且对应用程序和数据库服务器之间的网络延迟敏感,因为所有请求都通过同一连接进行序列化。这种方法的天真使用也会在启动时建立数据库连接,如果该连接中断,则必须重新启动。

每个HTTP请求的连接

另一方面,为每个http请求设置1个连接可能效率低,因为与数据库的初始握手需要时间,并且数据库可能被太多并行连接所淹没。

连接池

您通常需要的是connection pool,它可以保持最多可用于分发到任何线程的连接数,并在线程使用连接完成时重新使用。 Go中的database/sql包执行此类连接池,因为驱动程序正确实现了它,其他数据库API可能没有 - 并且您可以自己实现连接池。 PHP也有different variants连接池,有时称为“持久连接”(尽管在PHP使用的流程模型的情况下,自己实现这样的连接池会很困难)

答案 1 :(得分:0)

这里有两种极端方法:

  1. 快速连接,每次需要数据库访问时打开;
  2. 长连接,建立一次并永远保持开放。
  3. 第一种方法在性能方面有成本,因为建立与DB的连接是不可忽视的。

    第二个有一些缺点,因为连接可以超时,或者可以删除。所以它应该在需要时进行控制和重新建立。

    如果连接数不是很高,我建议采用第一种方法,它更简单可靠。

    如果您计划建立多个连接,并且您认为每次建立新连接时的成本都是一个问题,那么我建议您使用一些库来管理connection pool