如何在mod_perl中拥有DBIC持久数据库连接?

时间:2009-04-09 13:41:16

标签: database perl persistence dbi dbix-class

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

  1. 跨网络开放数据库连接
  2. 使用SQL语句对数据库执行查询
  3. 分析从数据库中检索的数据
  4. 以HTML格式打印数据
  5. 关闭数据库连接
  6. 经过一些剖析,我意识到步骤(1)是瓶颈。因此,我希望避免为每个CGI请求打开和关闭数据库连接。我的愿望是,如果我的第一个CGI请求打开了数据库连接,我的第二个传入CGI请求(来自不同的客户端)可能会重用第一个数据库连接。

    我尝试使用Google进行“DBIX持久数据库连接”但很难找到相关结果。 (编辑:那是因为它被称为DBIC,或DBIx :: Class,而不是DBIX。)

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

      

    Apache :: DBI模块仍有一个限制:它使每个进程的数据库连接保持持久。

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

    1. Apache将始终生成一个新进程来提供传入的新CGI请求。每当Perl解释器完成执行Perl脚本时,该过程就会失效。
    2. 因此,如果Apache :: DBI模块只能在每个进程的基础上保持数据库连接的持久性,那么我的第二个CGI请求如何重新使用第一个CGI请求打开的连接呢?

      但回到我原来的问题。如何在mod_perl中使用DBIX持久数据库连接?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

当你使用mod_perl(假设你的mod_perl设置是正确的)时,Perl解释器被加载到Apache中,你的程序加载到那里。 Apache运行有限数量的进程来处理请求 - 每个进程提供多个请求。

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

答案 2 :(得分:0)

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