извиняюсь и заранее благодарю за то, что, даже когда я печатаю, кажется, вероятно, глупым вопросом, но в любом случае.
У меня есть базовое приложение Catalyst, использующее DBIx::Class с "Автором" и связанной таблицей "Книга". Кроме того, я также использую DBIx::Class::Cursor::Cached для кэширования данных по мере необходимости.
Проблема в том, что после редактирования мне нужно очистить кэшированные данные ДО истечения срока их действия.
1.) Author->show_author_and_books, который извлекает и кэширует набор результатов.
2.) Book->edit_do, которому необходимо очистить кэшированные данные из запроса Author->show_author_and_books.
См. основные/соответствующие настройки ниже.
-- Определение MyApp.pm, включая внутренний кеш Cache::FileCache.
__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::Model::DB с признаками «Кэширование», установленными с использованием «DBIx::Class::Cursor::Cached».
...
__PACKAGE__->config(
schema_class => 'MyApp::Schema',
traits => [ 'Caching' ],
connect_info => { dsn => '<dsn>',
user => '<user>',
password => '<password>',
cursor_class => 'DBIx::Class::Cursor::Cached'
}
);
...
-- Определение MyApp::Controller::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_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
...
}
...
-- Определение MyApp::Controller::Book.pm с методом 'edit_do', который обновляет запись книги и делает недействительными кэшированные данные в show_author_and_books.
...
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 (не говоря уже о другой проблеме, которая может возникнуть).
Итак, это правильный подход, чтобы снова сделать запрос DBIx в соответствии с ...show_author_and_books, а затем снова вызвать 'clear_cache', или есть более прямой способ, где я могу просто сказать что-то вроде этого $c->cache->('DB::Author')->clear_cache?
Еще раз спасибо.
PS. Я уверен, когда я посмотрю на это завтра, меня поразит вся глупость вопроса :с