4

DBIx::Class を使用して mod_perl で CGI::Application を使用しており、インスタンス化時に新しい 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);
4

2 に答える 2

1

もちろん、データベース接続をセッション ファイルなどにシリアル化することはできず、Apache がフォークする前にデータベース接続を作成することはできませんが、子プロセスごとに 1 つのライブを維持することはできます。

事前に作成するオプションは、基本の mod_perl ハンドラー サブルーチンで作成することですが、その時点でクライアント接続が既に開始されているため、応答時間の改善にはつながりません。

したがって、上記のように遅延実装を行いますが、スキーマ オブジェクトを にキャッシュする代わりに$self、パッケージ レベルのプライベート変数にキャッシュします。これは、各 apache 子プロセスが 1 つのスキーマ接続を持つことを意味します。

my $_schema;

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

    return $_schema = ACD::Model->connect(...);
}
于 2009-10-06T00:02:18.503 に答える