【问题标题】:Is DB connection pooling all that important?数据库连接池真的那么重要吗?
【发布时间】:2011-06-28 15:52:33
【问题描述】:

在 Java 世界中,应用服务器汇集“昂贵”资源(如数据库连接)是非常标准的做法。另一方面,在动态语言中,大多数堆栈与池化资源,尤其是数据库连接几乎没有关系。

例如对于流行的 PHP+MySQL 组合,我很少看到它与持久连接一起使用,这可以被认为是穷人池连接。

如果池化数据库连接的概念没有得到广泛实施,这是否意味着在实际部署中性能/可扩展性的提升可能并不那么重要?

【问题讨论】:

    标签: php jakarta-ee connection-pooling dynamic-languages


    【解决方案1】:

    经常使用连接轮询,因为某些数据库供应商会根据您的许可证限制您与给定数据库的连接数。开源数据库没有这样的限制,因为它们是免费的。所以这对 MySQL 来说不是什么大问题。

    使用连接轮询的另一个原因是限制与数据库服务器的当前连接数,因为每个新连接都会消耗大量内存,并且您不想耗尽服务器内存。

    持久连接的问题是它们永远不会关闭,直到客户端进程死亡。客户端进程实际上是处理 PHP 请求的 Web 服务器进程。因此,如果您将 Web 服务器配置为限制同时请求的数量,您也会限制打开的持久数据库连接的数量。您可以在 Apache 中将 MaxClients 参数设置为不会耗尽服务器 RAM 的合理值。

    顺便说一句,将所有静态内容(CSS、JavaScript、图像等)移动到单独的多线程 Web 服务器(Nginx、lighttpd 等)也是明智之举,这样不会导致同时用户访问你的 Apache fork 到很多进程。

    【讨论】:

    • 我不确定第一段是否属实。连接是重量级对象,因此它们需要被池化。并不是特定的数据库服务器无法处理 100 或 1000 的连接。
    • 我没有说这是使用连接池的唯一原因。我只是说它经常用于这个原因,但可能还有其他原因。
    【解决方案2】:

    我的一般意见是,连接池通常不用于速度不被视为其他问题重要的环境中。例如,AOLServer 使用动态语言 (Tcl),但具有高性能并使用连接池。

    【讨论】:

      【解决方案3】:

      如果池化DB的概念 连接不是那么广泛 实施,这是否意味着 性能/可扩展性增益可能 不是那么重要,在 实际部署?

      这只是意味着 PHP 没有内置的连接池。但这并不意味着您不能使用其中之一,例如,使用 Postgres 您可以使用 PGPool。

      【讨论】:

        【解决方案4】:

        连接池的主要原因是在第一个实例中建立连接的开销。我在过去看到这最多需要 0.5 秒。

        在高事务性环境中,保持连接打开并沿连接发送多个请求(一个接一个)的能力可显着节省。因此,如果忽略这种有用的模式,您可能看不到低事务数据库的收益,但您的应用程序也不会扩展。

        它还有助于以更清晰的方式管理打开的连接数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-24
          • 1970-01-01
          • 2022-08-08
          相关资源
          最近更新 更多