2008-08-29 12 views
2

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

Music::DBI->clear_object_index(); 

А:

Music::Artist->purge_object_index_every(2000); 

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

Любые предложения по его устранению?

ответ

5

На странице «common problems» на странице Class::DBI wiki есть section по этой теме. Самое простое решение, чтобы отключить индекс живого объекта целиком, используя:

$Class::DBI::Weaken_Is_Available = 0; 
+0

Ссылка сейчас мертва. Кто-нибудь знает обновленную ссылку? –

0

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

2

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

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

Music::Artist->purge_object_index_every(2000); 

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

Кроме того,

Music::DBI->clear_object_index(); 

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

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

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

-1

Следует отметить, что Class :: DBI устарел, и вместо этого вы должны поместить свой код в DBIx::Class.

Смежные вопросы