【问题标题】:How can I have DBIC persistent database connection in mod_perl?如何在 mod_perl 中建立 DBIC 持久数据库连接?
【发布时间】:2010-10-18 13:41:22
【问题描述】:

我正在为我的 Web 应用程序使用 mod_perl。目前,我计划在网络上使用一个mysql数据库。在对 display_customer_transaction.cgi 的每个 CGI 请求中,我的脚本都会

  1. 跨网络打开数据库连接
  2. 使用 SQL 语句对数据库执行查询
  3. 分析从数据库中检索到的数据
  4. 以 HTML 格式打印数据
  5. 关闭数据库连接

经过一些分析,我意识到步骤 (1) 是瓶颈。因此,我希望避免为每个 CGI 请求打开和关闭数据库连接。我的愿望是,如果我的第一个 CGI 请求打开了一个数据库连接,我的第二个传入 CGI 请求(来自不同的客户端)可能会重用第一个数据库连接。

我尝试在 Google 上搜索“DBIX Persistent Database Connection”,但几乎找不到相关结果。 (编辑:那是因为它被称为 DBIC,或 DBIx::Class,而不是 DBIX。)

我使用Apache::DBI 进一步查找相关信息(但是,我的意图是针对 DBIX,而不是 Apache::DBI)。有一些信息让我感到困惑:

Apache::DBI 模块仍然有一个限制:它在每个进程的基础上保持数据库连接的持久性。

一直以来,我对 Apache 如何服务 CGI 请求的概念是这样的

  1. Apache 将始终生成一个新进程来服务传入的新 CGI 请求。每当 Perl 解释器执行完 Perl 脚本时,进程就会死掉。

那么,如果 Apache::DBI 模块只能在每个进程的基础上保持数据库连接的持久性,我的第二个 CGI 请求如何重新使用第一个 CGI 请求打开的连接?

但是回到我最初的问题。如何在 mod_perl 中建立 DBIX 持久数据库连接?

【问题讨论】:

标签: database perl persistence dbi dbix-class


【解决方案1】:

在注销之前尝试 Apache::DBI。但是,您还想让 CGI 脚本持久化。如果你现在有 vanilla CGI 程序,你可以使用 PerlRun 或 PerlRegistry 选项使它们持久化。这与 Apache::DBI 一起应该可以完成这项工作。当然,每个子进程都有 DBI 连接,但这并非不合理。

在放弃之前先试一试。 :)

【讨论】:

    【解决方案2】:

    Apache::DBI 改变了 DBI 模块的工作方式。假设您正在使用 DBIx::Class (您不够具体),那么它使用 DBI 模块来获取其数据库连接,所以这对您有用。

    当您使用 mod_perl(并假设您的 mod_perl 设置正确)时,一个 Perl 解释器会加载到 Apache 中,而您的程序也会加载到其中。 Apache 运行有限数量的进程来服务请求——每个进程服务多个请求。

    Apache 进程最终会死掉并重新生成,但在此之前它们会处理许多请求。这些是 Apache::DBI 文档所指的过程;它试图说“您将一遍又一遍地重复使用相同的连接,但这并不意味着一次只打开一个连接。”

    【讨论】:

      【解决方案3】:

      最后,基于我的每秒连接数非常低的判断,我这个时候没有使用持久连接。对于性能扩展计划,我宁愿选择 DBIx + memcache 解决方案。

      【讨论】:

        猜你喜欢
        • 2014-09-08
        • 2023-03-11
        • 2019-03-04
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 2020-11-25
        • 2010-11-10
        • 1970-01-01
        相关资源
        最近更新 更多