2009-01-14 5 views
4

J'utilise CGI :: Application sur mod_perl avec DBIx :: Class et j'aimerais avoir quelque chose comme new définir un nouveau schéma dbic sur instanciation. Jusqu'à présent, je n'ai pas réussi à le faire fonctionner. La chose la plus proche à laquelle je suis arrivé est une superclasse qui a une méthode connect() qui retourne un nouvel objet, mais je préférerais qu'il soit déjà connecté et instancié.Comment avoir une DBIx :: Class persistante dans CGI :: Application avec mod_perl?

J'apprécierais vraiment toutes les pensées du tout.

Merci!

Note: Ok, donc évidemment pas encore d'aide, mais, en attendant, j'ai fait un accesseur qui instancie paresseusement DBIx :: Class, donc ça pourrait être un peu mieux. Check it:

sub schema { 
    my $self = shift; 
    unless ($self->{schema}) { 
     $self->{schema} = ACD::Model->connect(@{$self->cfg->{$ENV{MODE}}->{connect_params}}); 
    } 
    return $self->{schema}; 
} 

et puis bien sûr l'utiliser, vous feriez quelque chose comme:

$self->schema->resultset('Foo')->find(1234); 
+0

Je n'ai pas de réponse cohérente pour vous ... mais je pense que c'est un hack que vous voulez éliminer. "$ self" ne devrait pas être responsable de la gestion de la connexion à la base de données; vous devriez instancier la connexion à la base de données "ailleurs" et la passer ensuite aux objets qui en ont besoin. (Des modules comme Bread :: Board rendent cela vraiment facile.) – jrockway

Répondre

1

Bien sûr, vous ne pouvez pas sérialiser une connexion de base de données dans un fichier de session ou autre, et vous ne pouvez pas le créer avant les forks apache, mais vous pouvez conserver un processus live par enfant. Une option pour la créer à l'avance est de le faire dans votre sous-gestionnaire mod_perl de base, mais puisque la connexion client a déjà démarré à ce moment-là, elle ne vous apporte aucune amélioration du temps de réponse.

donc je ferais une mise en œuvre paresseux comme vous avez ci-dessus, mais au lieu de la mise en cache l'objet de schéma dans $self, cache dans un niveau de paquet variable privée, ce qui signifie chaque processus enfant apache a exactement une connexion de schéma:

my $_schema; 

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

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