2012-02-08 11 views
0

は、私が入力したものであっても、愚かな疑問に思われるものを事前にお詫びしてくれてありがとう、とにかくここに行く。Perl Catalyst DBIxカーソルキャッシュ - クリアするには?

私は、「著者」と関連した「ブック」テーブルでDBIx ::クラスを使用して、基本的な触媒アプリケーションを持っています。また、私はDBIx :: Class :: Cursor :: Cachedを使用して、必要に応じてデータをキャッシュします。

問題は、編集後、実際に期限が切れる前にキャッシュデータを消去する必要があることです。
1.)author-> show_author_and_books結果セットをフェッチしてキャッシュします。

2)Book-> edit_do ですauthor-> show_author_and_books要求からキャッシュされたデータをクリアする必要があります

以下の基本的な/適切な設定を参照してください。

- バックエンドの 'Cache :: FileCache'キャッシュを含むMyApp.pm定義。

__PACKAGE__->config(
name   => 'MyApp', 
... 

'Plugin::Cache' => { 'backend' => { class    => 'Cache::FileCache', 
             cache_root   => "./cache", 
             namespace   => "dbix", 
             default_expires_in => '8 hours', 
             auto_remove_stale => 1 
            } 
        }, 
... 

- のMyApp :: 'キャッシュ' 形質は 'DBIx ::クラス::カーソル::キャッシュ' を使用して設定を持つモデル:: DB定義。

... 
__PACKAGE__->config(
schema_class => 'MyApp::Schema', 

traits  => [ 'Caching' ], 

connect_info => { dsn   => '<dsn>', 
        user   => '<user>', 
        password  => '<password>', 
        cursor_class => 'DBIx::Class::Cursor::Cached' 
       } 
); 
... 

- 'show_author_and_books' メソッドとのMyApp ::コントローラ:: Author.pmの定義 - 結果がキャッシュされています。

... 
sub show_author_and_books :Chained('base') :PathPart('') :Args(0) 
{ 
    my ($self, $c) = @_; 

    my $author_id = $c->request->params->{author_id}; 

    my $author_and_books_rs = $c->stash->{'DB::Author'}->search({ author_id => $author_id }, 
                  { prefetch => 'book' }, 
                   cache_for => 600 }); # Cache results for 10 minutes. 

    # More interesting stuff, but no point calling $author_and_books_rs->clear_cache here, it would make no sense:s 
    ... 

} 

...  

- 帳のエントリを更新し、そうshow_author_and_booksにキャッシュされたデータを無効化する 'edit_do' メソッドとのMyApp ::コントローラ:: Book.pm定義。

... 
sub edit_do :Chained('base') :PathPart('') :Args(0) 
{ 
    my ($self, $c) = @_; 

    # Assume stash contains a book for some author, and that we want to update the description. 

    my $book = $c->stash->{'book'}->update({ desc => $c->request->params->{desc} }); 

    # How do I now clear the cached DB::Author data to ensure the new desc is displayed on next request to 'Author->show_author_and_books'? 

    # HOW DO I CLEAR CACHED DB::Author DATA? 

    ... 
} 

当然のことながら、私は$ author_and_books_rsは、ですauthor-> show_author_and_booksで定義されているように、方法 'clear_cache' が含まれていますが、明らかにこれはBook-> edit_doにスコープ外であることを承知しています(他にも問題はないかもしれません)。

ので、 show_author_and_books ... あたりとして、再びDBIx要求を行うための正しいアプローチで、その後、再びその「をclear_cache」を呼び出すか、私はちょうどこの$のようなものを言うことができる、より直接的な方法がありますc->キャッシュ - >( 'DB :: Author') - > clear_cache?

もう一度ありがとうございます。

PS。私はこの明日を見たとき、私は確信している、問題の完全な愚かさが私をヒットします。■

答えて

0

てみ

$c->model('DB::Author')->clear_cache() ; 
+0

Dが役に立った:ありがとうございましたC :: Cursor ::単一の名前空間にキャッシュされます(たとえば、キャッシュには 'DB :: Author'データ、 'DB :: Books'、 'DB :: Other'が含まれます)。特定のセットまたは特定のネームスペースを期限切れにする必要があるため、代わりに次の解決策を検討しました。 – user647248

0

私が行ったのソリューションを最後に「DBIxを使用しないことでした:: Class :: Cursor :: Cached 'の代わりに複数の バックエンドキャッシュを定義するCatalyst Cacheプラグインを直接使用して、現実のシナリオで管理しようとしているさまざまな名前空間を処理します。

私はD :: C :: Cursor :: Cachedの背後にあるのは、すべてのデータが同じ名前空間に保持されているためです。さらに、 の時間が既に設定されているデータを期限切れにするメソッドではありません。

完全性のために、上記のコードから、MyApp :: Model :: DB.pm定義は 'traits'と 'cursor_class'のキー/値を失います。その後

...

MyApp.pmプラグイン::キャッシュ]複数のキャッシュの名前空間を含むように拡大する

...

-- MyApp.pm definition including backend 'Cache::FileCache' cache. 

... 
'Plugin::Cache' => { 'backends' => { Authors => { class    => 'Cache::FileCache', 
                cache_root   => "./cache", 
                namespace   => "Authors", 
                default_expires_in => '8 hours', 
                auto_remove_stale => 1 
               }, 
            CDs => { class      => 'Cache::FileCache', 
                 cache_root   => "./cache", 
                 namespace   => "CDs", 
                 default_expires_in => '8 hours', 
                 auto_remove_stale => 1 
               }, 
            ...    
            } 
...         

- のMyApp ::コントローラ:: Author.pm定義'show_author_and_books'メソッドでは、結果セットがキャッシュされます。

... 
sub show_author_and_books :Chained('base') :PathPart('') :Args(0) 
{ 
    my ($self, $c) = @_; 

    my $author_id = $c->request->params->{author_id}; 

    my $author = $c->get_cache_backend('Authors')->get($author_id); 

    if(!defined($author)) 
    { 
     $author = $c->stash->{'DB::Author'}->search({ author_id => $author_id }, 
                { prefetch => 'book', rows => 1 })->single; 

     $c->get_cache_backend('Authors')->set($author_id, $author, "10 minutes"); 
    }                

    # More interesting stuff, ... 
    ... 
} 

... 

- 帳のエントリを更新し、そうshow_author_and_booksでキャッシュされたデータを無効化する「edit_do」メソッドとのMyApp ::コントローラ:: Book.pm定義。

... 
sub edit_do :Chained('base') :PathPart('') :Args(0) 
{ 
    my ($self, $c) = @_; 

    # Assume stash contains a book for some author, and that we want to update the description. 

    my $book = $c->stash->{'book'}->update({ desc => $c->request->params->{desc} }); 

    # How do I now clear the cached DB::Author data to ensure the new desc is displayed on next request to 'Author->show_author_and_books'? 

    # HOW DO I CLEAR CACHED DB::Author DATA? THIS IS HOW, EITHER... 

    $c->get_cache_backend('Authors')->set($c->stash->{'book'}->author_id, {}, "now"); # Expire now. 

    # ... OR ... THE WHOLE Authors namespace... 

    $c->get_cache_backend('Authors')->clear;  

    ... 
} 

注:あなたは著者やCDの使用から期待するだろうとして、これは私が働いている現実の世界のシナリオではありませんが、私の意図を表示するために役立つはずです。

私はDBIxと実際にCatalystの驚異に慣れているので、これにもっと良いアプローチがあるかどうか聞いてみたいと思いますが(私は非常に期待していますが)、レガシーアプリケーションを更新しようとしています。

0

プラグインはおそらく、結果セットキャッシュごとにネームスペースとクリアを独立にするためにパッチを当てることができます。あるいは、属性にネームスペースを追加するのは難しくありません。そのヒット#dbix-classで作業したいと思うなら、あなたに指導してもらいたいです - jnap

関連する問題