Как я сокращаю количество избыточных запросов с mod_perl правильно?

В довольно большом проекте прежней версии я осуществил рефакторинг несколько волосатых модулей в классы Американского лося. Каждый из этих модулей требует доступа к базе данных к (ленивой) выборке его атрибуты. Так как те объекты используются довольно в большой степени, я хочу сократить количество избыточных запросов, например, для неизменных данных.

Теперь, как я делаю это правильно? У меня есть несколько альтернатив:

  1. Реализация, кэширующаяся в моих классах Американского лося через роль для хранения их в memcached с истечением 5-10 минут (вероятно, не слишком трудный, но хитрый с ленивыми атрибутами) обновление: KiokuDB мог, вероятно, помочь здесь, иметь для чтения об атрибутах
  2. Мигрируйте на DBIx::Class (потребности, которые будут сделаны так или иначе) и реализация, кэширующаяся на этом уровне (DBIC, вероятно, возьмет большую часть боли далеко просто отдельно),
  3. Так или иначе заставьте мои объекты сохраниться в процессе mod_perl (никакая подсказка, как сделать это :()

Как Вы сделали бы это и что Вы рассматриваете нормальным путем? Кэширование данных предпочтено на объекте или уровне ORM?

6
задан David B 25 October 2010 в 19:18
поделиться

2 ответа

Поскольку вы все равно уже собираетесь делать DBIC, имеет смысл позволить этому изменению позаботиться об этом. Было бы менее разумно развернуть свою собственную систему, а затем внедрить DBIC, что заставит ваших сопровождающих задуматься, когда они обнаружат, что вы используете DBIC, но с собственным кэшированием ... "по какой-то причине".

Единственной причиной не делать этого может быть (1) если вам действительно нужна эта производительность сейчас, и у вас нет времени ждать изменений DBIC, поскольку я предполагаю, что они будут довольно обширными. Или (2) если вы не уверены в том, действительно ли вы собираетесь переходить на DBIC. Если вы не изучали этот вопрос и делаете много пользовательского SQL вместо базового CRUD, это может оказаться очень маленьким возвратом на инвестиции.

0
ответ дан 17 December 2019 в 22:12
поделиться

Краткий ответ на № 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, чтобы они были общими для всех дочерних элементов.

1
ответ дан 17 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: