Являются ли модели Catalyst только один раз, а затем использованы для срока службы приложения? Или $c->model()
каждый раз создавайте новый класс модели?
Это зависит от вашей реализации модели. Если в вашей модели есть метод ACCEPT_CONTEXT
, Catalyst будет создавать новый объект каждый раз, когда вы вызываете $c->model()
. Если нет, он будет создан один раз во время запуска приложения. Это зарегистрировано в Catalyst::Manual::Internals под кодом Инициализация.
В YAPC::EU 2016 in Cluj текущий разработчик Catalyst, Джон Напиорковски, дал (удаленный) разговор о Catalyst, который объясняет этот самый аспект, начиная с from about 53 minutes into the talk. Все это, как и его другой разговор, стоит посмотреть.
Если я бег моего приложения с FastCGI и есть 6 нитей, это означает, что каждая нить моего приложения получит свой собственный класс модели и будет делать запросы и hapve 6 отдельных кэша, правильно?
Я не уверен в этом. Я считаю, что он запускается один раз, а затем разворачивается. Поэтому он создаст один экземпляр и скопирует его на вилки.
Использование DBIx :: Class :: Cursor :: Cached для вашего подхода выглядит так, как будто это сработает. Если вам нужны объекты DBIx :: Class ResultSet, это хорошо. Если нет, вы можете просто приложить результаты как ленивые атрибуты к вашей модели. Это может выглядеть примерно так:
package My::Model;
use Mooose;
use My::DB::Schema;
extends 'Catalyst::Model';
has stuff => (
is => 'ro',
isa => 'HashRef',
traits => ['Hash'],
handles => {
has_stuff => 'exists',
get_stuff => 'get',
# ...
},
lazy => 1,
builder => '_build_stuff',
);
sub _build_stuff {
my ($self) = @_;
# get stuff from the DB here, convert it to a config hash
# or whatever you need and store it in our stuff attribute
# that works well if your config looks something like this:
# {
# color => 'red',
# price => 13.37,
# things => [ qw/ foo bar baz/],
# # ...
# }
# you can then use the Hash trait on your attribute to access it
}
1;
Таким образом он будет загружать его при первом использовании, а затем все готово. Он просто будет храниться в объекте.
Если вы хотите выяснить, работает ли это на самом деле и не делает больше запросов, вы можете включить DBIC 's tracing output, используя переменную окружения DBIC_TRACE=1
. Он сбрасывает красочные запросы в ваш журнал Catalyst.
В качестве альтернативы CHI велик для создания тайников вещей, хотя здесь это, вероятно, немного излишним.
Спасибо за подробный ответ! Мне нравится, как вытащить его из db при запуске, а затем использовать его - это именно то, что я искал. Один вопрос, который мне задает вопрос, как вы думаете, это лучшее решение, чем использование Memoize? Или Memoise плохое решение? Потому что по существу это работает очень похоже, так как он просто создает хэш. Я думаю, что мне нравится ваше решение лучше, поскольку оно полностью кэшируется после того, как объект построен, просто любопытно в ваших мыслях. – srchulo
@src Я думаю, что это не плохое решение, и всегда есть много способов сделать это, но это сделано для другой цели. Я бы пошел самым простым способом. Использование атрибута Moose очень естественно. Он не добавляет зависимости, и он прост в использовании. Я использую этот подход много с данными из файлов, и он отлично работает. – simbabque
Awesome. Вот что я сделаю. Благодаря! – srchulo