В довольно большом проекте прежней версии я осуществил рефакторинг несколько волосатых модулей в классы Американского лося. Каждый из этих модулей требует доступа к базе данных к (ленивой) выборке его атрибуты. Так как те объекты используются довольно в большой степени, я хочу сократить количество избыточных запросов, например, для неизменных данных.
Теперь, как я делаю это правильно? У меня есть несколько альтернатив:
memcached
с истечением 5-10 минут (вероятно, не слишком трудный, но хитрый с ленивыми атрибутами) обновление: KiokuDB мог, вероятно, помочь здесь, иметь для чтения об атрибутахDBIx::Class
(потребности, которые будут сделаны так или иначе) и реализация, кэширующаяся на этом уровне (DBIC, вероятно, возьмет большую часть боли далеко просто отдельно),Как Вы сделали бы это и что Вы рассматриваете нормальным путем? Кэширование данных предпочтено на объекте или уровне ORM?
Поскольку вы все равно уже собираетесь делать DBIC, имеет смысл позволить этому изменению позаботиться об этом. Было бы менее разумно развернуть свою собственную систему, а затем внедрить DBIC, что заставит ваших сопровождающих задуматься, когда они обнаружат, что вы используете DBIC, но с собственным кэшированием ... "по какой-то причине".
Единственной причиной не делать этого может быть (1) если вам действительно нужна эта производительность сейчас, и у вас нет времени ждать изменений DBIC, поскольку я предполагаю, что они будут довольно обширными. Или (2) если вы не уверены в том, действительно ли вы собираетесь переходить на DBIC. Если вы не изучали этот вопрос и делаете много пользовательского SQL вместо базового CRUD, это может оказаться очень маленьким возвратом на инвестиции.
Краткий ответ на № 3: не используйте «мое». Вы можете сделать что-то вроде:
use vars qw($object);
# OR post perl5.6:
# our ($object);
# create your object if it doesn't already exist
$object ||= create_object;
# Maybe reload some attributes if they have expired.
$object->check_expires;
Объекты, созданные таким образом внутри вашего обработчика, будут совместно использоваться только внутри каждого дочернего элемента Apache, что нормально, если вы перезагружаете данные каждые 5-10 минут. Любые модули и объекты, которые доступны только для чтения, должны быть загружены в сценарий PerlPostConfigRequire, чтобы они были общими для всех дочерних элементов.