2

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

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

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

我试图用谷歌搜索“DBIX 持久数据库连接”,但几乎找不到相关结果。(编辑:那是因为它被称为 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 持久数据库连接?

4

3 回答 3

4

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

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

于 2009-04-09T15:36:39.640 回答
1

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

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

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

于 2009-05-06T20:40:49.463 回答
0

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

于 2009-05-26T03:42:49.733 回答