Как у меня есть постоянный DBIx :: Class в CGI :: Application с mod_perl? - PullRequest
4 голосов
/ 14 января 2009

Я использую CGI :: Application в mod_perl с DBIx :: Class, и я хотел бы, чтобы что-то вроде 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);

Ответы [ 2 ]

1 голос
/ 06 октября 2009

Конечно, вы не можете сериализовать соединение с базой данных в файл сеанса или что-то еще, и вы не можете создать его до того, как 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(...);
}
0 голосов
/ 07 мая 2009

У меня нет ни одного ответа, но http://lists.scsys.co.uk/pipermail/dbix-class/2006-June/001690.html, вероятно, стоит прочитать, так что вы понимаете, как DBIC управляет соединениями.

...