Как я могу очистить класс :: внутренний кэш DBI?

StackOverflow https://stackoverflow.com/questions/35480

  •  09-06-2019
  •  | 
  •  

Вопрос

В настоящее время я работаю над большой реализацией Class :: DBI для существующей структуры базы данных и сталкиваюсь с проблемой с очисткой кэша из класса :: DBI. Это реализация MOD_PERL, поэтому экземпляр класса может быть довольно старым, когда к нему доступ к ней. На страницах Man я нашел два варианта:

Music::DBI->clear_object_index();

И:

Music::Artist->purge_object_index_every(2000);

Теперь, когда я добавляю clear_object_index () в метод уничтожения, он, кажется, работает, но на самом деле не опустошает кэш. Я могу вручную изменить базу данных, перезапустить запрос, и это все еще старая версия. purge_object_index_every говорит, что он очищает индекс каждые n запросов. Установка этого на «1» или «0», кажется, очищает индекс ... иногда. Я ожидаю, что один из этих двух будет работать, но по какой -то причине это не делает это каждый раз. Больше похоже на 1 в 5 раз.

Есть предложения по очистке этого?

Это было полезно?

Решение

"общие проблемы"Страница на Класс :: DBI Wiki имеет раздел на эту тему. Самое простое решение - полностью использовать индекс живых объектов:

$Class::DBI::Weaken_Is_Available = 0;

Другие советы

$ obj-> dbi_commit (); Может быть, вы ищете, если у вас есть незавершенные транзакции. Тем не менее, это вряд ли случайно, так как он имеет тенденцию автоматически завершать любые затяжные транзакции при уничтожении.

Когда вы делаете это:

Music::Artist->purge_object_index_every(2000);

Вы говорите, что он изучает кеш объектов каждые нагрузки объекта 2000 и удаляет любые мертвые ссылки на сохранение использования памяти. Я не думаю, что это то, что вы хотите вообще.

Более того,

Music::DBI->clear_object_index();

Удаляет все объекты формируют индекс Live Object. Я не знаю, как это поможет вообще; Это не промывает их на диск, правда.

Похоже, то, что вы пытаетесь сделать, должно работать очень хорошо, как у вас есть, но может возникнуть проблема с вашим SQL или в другом месте, что предотвращает вставку или обновление работы. Вы делаете проверку ошибок для каждого запроса базы данных, как предлагает Perldoc? Возможно, вы можете начать там или в журналах ошибок в базе данных, наблюдая за вопросами, чтобы понять, почему они не завершены или, если они когда -либо прибывают.

Надеюсь это поможет!

В прошлом я успешно использовал remove_from_object_index, так что, когда страница называется, которая изменяет базу данных, она всегда явно сбрасывает этот объект в кэше как часть страницы подтверждения.

Я должен отметить, что класс :: dbi устарел, и вы должны перенести свой код в Dbix :: class вместо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top