Как очистить внутренний кеш Class :: DBI? - PullRequest
2 голосов
/ 30 августа 2008

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

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 раз.

Какие-нибудь предложения по устранению этого?

Ответы [ 4 ]

5 голосов
/ 30 августа 2008

Страница " Распространенные проблемы " в Class :: DBI wiki содержит раздел на эту тему. Самое простое решение - полностью отключить индекс живого объекта, используя:

$Class::DBI::Weaken_Is_Available = 0;
2 голосов
/ 06 сентября 2008

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

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

Music::Artist->purge_object_index_every(2000);

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

Кроме того,

Music::DBI->clear_object_index();

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

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

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

0 голосов
/ 05 января 2010

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

0 голосов
/ 06 сентября 2008

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

...