2009-01-14 18 views
4

我使用CGI ::應用與DBIx ::類的mod_perl,我想有一些像新的定義上實例化一個新的DBIC架構。到目前爲止,我還沒有能夠得到它的工作。我所接觸到的最接近的是具有返回新對象的connect()方法的超類,但我寧願它已經被連接並實例化。我如何有一個持久的DBIx ::類的CGI ::應用程序使用的mod_perl?

我會很感激的任何想法都沒有。

謝謝!

注意:好的,所以顯然沒有幫助,但是,在此期間,我做了一個訪問器,懶惰地實例化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); 
+0

我沒有給你一個連貫的答案...但我認爲這是要消除黑客攻擊。 「$ self」不應該負責管理數據庫連接;你應該實例化數據庫連接「別的地方」,然後將它傳遞給需要它的對象。 (像Bread :: Board這樣的模塊使得這非常簡單。) – jrockway 2009-10-06 00:08:02

回答

1

當然你不能連載一個數據庫連接到一個會話文件或什麼的,和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(...); 
} 
相關問題