は、私が入力したものであっても、愚かな疑問に思われるものを事前にお詫びしてくれてありがとう、とにかくここに行く。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。私はこの明日を見たとき、私は確信している、問題の完全な愚かさが私をヒットします。■
Dが役に立った:ありがとうございましたC :: Cursor ::単一の名前空間にキャッシュされます(たとえば、キャッシュには 'DB :: Author'データ、 'DB :: Books'、 'DB :: Other'が含まれます)。特定のセットまたは特定のネームスペースを期限切れにする必要があるため、代わりに次の解決策を検討しました。 – user647248