Как мне получить постоянный 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);

person Frew Schmidt    schedule 14.01.2009    source источник
comment
У меня нет для вас внятного ответа ... но я думаю, что это взлом, от которого вы хотите избавиться. $ self не должен отвечать за управление подключением к базе данных; вы должны создать экземпляр соединения с базой данных в другом месте, а затем передать его объектам, которые в нем нуждаются. (Такие модули, как Bread :: Board, делают это очень просто.)   -  person jrockway    schedule 06.10.2009


Ответы (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(...);
}
person Mark Aufflick    schedule 06.10.2009

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

person Penfold    schedule 07.05.2009