【问题标题】:How do I have a persistent DBIx::Class in CGI::Application with mod_perl?如何使用 mod_perl 在 CGI::Application 中拥有持久的 DBIx::Class?
【发布时间】:2009-10-06 08:02:18
【问题描述】:

我正在使用带有 DBIx::Class 的 mod_perl 上的 CGI::Application 并且我希望在实例化时使用 new 定义一个新的 dbic 模式。到目前为止,我还无法让它工作。我最接近的是一个超类,它有一个 connect() 方法,该方法返回一个新对象,但我宁愿它已经被连接和实例化。

我真的很感激任何想法。

谢谢!

注意:好的,显然还没有帮助,但是,与此同时,我创建了一个访问器,它可以延迟实例化 DBIx::Class,这样可能会更好一些。检查它:

sub schema {
    my $self = shift;
    unless ($self->{schema}) {
        $self->{schema} = ACD::Model->connect(@{$self->cfg->{$ENV{MODE}}->{connect_params}});
    }
    return $self->{schema};
}

然后当然要使用它,您会执行以下操作:

$self->schema->resultset('Foo')->find(1234);

【问题讨论】:

  • 我没有给你一个连贯的答案......但我认为这是你想要消除的黑客行为。 "$self" 不应该负责管理数据库连接;您应该在“其他地方”实例化数据库连接,然后将其传递给需要它的对象。 (像 Bread::Board 这样的模块让这变得非常简单。)

标签: perl mod-perl dbix-class cgiapp


【解决方案1】:

当然,您不能将数据库连接序列化为会话文件或其他任何内容,也不能在 apache 分叉之前创建它,但您可以让每个子进程保持一个活动。

提前创建它的一个选项是在您的基本 mod_perl 处理程序子中进行,但由于客户端连接此时已经开始,它不会为您带来任何响应时间改进。

所以我会像上面那样做一个惰性实现,但不是在$self 中缓存模式对象,而是将其缓存在包级别的私有变量中,这意味着每个 apache 子进程只有一个模式连接:

my $_schema;

sub schema {
    return $_schema
        if $_schema; # actually, you should check the db connection is live

    return $_schema = ACD::Model->connect(...);
}

【讨论】:

    【解决方案2】:

    我没有一个单一的答案,但http://lists.scsys.co.uk/pipermail/dbix-class/2006-June/001690.html 可能值得一读,因此您了解 DBIC 如何管理连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2014-10-03
      • 2018-12-13
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多