perl - 如何使用 mod_perl 在 CGI::Application 中拥有持久的 DBIx::Class?

标签 perl mod-perl dbix-class cgiapp

我在带有 DBIx::Class 的 mod_perl 上使用 CGI::Application,我希望在实例化时定义一个新的 dbic 模式。到目前为止,我还无法让它工作。我最接近的是一个父类(super class),它有一个 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);

最佳答案

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

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

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

my $_schema;

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

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

关于perl - 如何使用 mod_perl 在 CGI::Application 中拥有持久的 DBIx::Class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/442144/

相关文章:

perl - 使用 mod_cgi 和 mod_perl 捕获错误

mysql - 如何使用 DBIx::Class 正确部署模式?

perl - 如何在 Perl 中与 DBIx::Class 设置多主列 1:n 关系?

perl - 找出哪些脚本正在调用 perl 包

perl - 通过grep从值中获取关键细节

perl - 无法调用方法状态 - 错误

MySql:事务不检测死锁?

python - 我们可以从同一个服务器/盒子运行 perl 和 python cgi Web 门户吗

perl - 是否有与 PHP 的 ignore_user_abort() 等效的 mod_perl2/Perl 5?

perl - 如何在 mod_perl 中追踪 CPU 密集型请求?