Как у меня есть постоянный DBIx::Class в CGI::Application с mod_perl?
Я использую 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 ответа
Конечно, вы не можете сериализовать соединение с базой данных в файл сеанса или что-то в этом роде, и вы не можете создать его до того, как 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(...);
}
У меня нет ни одного ответа, но http://lists.scsys.co.uk/pipermail/dbix-class/2006-June/001690.html, вероятно, стоит прочитать, так что вы понимаете, как DBIC управляет соединениями.