#oracle-coherence
#oracle-coherence
Вопрос:
У меня возникли проблемы с кластером кэша для очистки всех хранилищ данных кэша.
Этот кластер содержит 89 хранилищ кэша, и для полной выгрузки данных требуется более 40 минут.
Я использую эту функцию:
public void deleteAll() {
try {
getCache().clear();
} catch (Exception e) {
log.error("Error unloading cache",getCache().getCacheName());
}
}
Метод getCache извлекает NamedCache из CacheFactory.
public NamedCache getCache() {
if (cache == null) {
cache = com.tangosol.net.CacheFactory.getCache(this.idCacheFisica);
}
return cache;
}
Кто-нибудь нашел какой-либо другой способ сделать это быстрее?
Заранее благодарю вас,
Комментарии:
1. Вызывается ли
eraseAll
метод для каждогоCacheStore
?2. Да, цель этого метода — оставить кластер кэша пустым для перезагрузки новых данных.
3. Итак, вы используете
CacheStore
, но инициализируете кэш вне кластера? Если это действительно то, что вы хотите сделать, я бы посмотрел на реализациюCacheStore
s — удаляют ли они строки по одному ключу за раз или выполняют массовое удаление?4. да, обновление данных происходит из внешнего события. И я не могу найти ни одной ссылки на массовое удаление. Но этого было бы достаточно с помощью метода быстрой очистки кэша. Потому что затем они снова загрузят все данные. Заранее благодарю вас, Ник.
5. Пожалуйста, добавьте несколько примеров кода для одной из
CacheStore
реализаций
Ответ №1:
Странно, что это займет так много времени, хотя, честно говоря, это необычно для вызова clear
.
Вы можете попробовать уничтожить кеш с помощью NamedCache.уничтожить или CacheFactory.destroy(NamedCache).
Единственная проблема с этим заключается в том, что это делает недействительными любые ссылки, которые могут быть в кэше, которые необходимо будет повторно получить с помощью другого вызова CacheFactory.getCache .
Ответ №2:
Часто вызов «массовой операции», такой как clear(), будет передаваться обратно на резервные карты как массовая операция, но в какой-то момент (где-то внутри серверного кода) станет реализацией на основе итераций, так что каждая удаляемая запись может быть оценена в соответствии с любыми зарегистрированными правилами, триггеры, прослушиватели событий и т. Д., И чтобы резервные копии могли быть точно записаны. Другими словами, чтобы гарантировать «корректность» в распределенной среде, это замедляет работу и заставляет ее выполняться в виде некоторой упорядоченной последовательности подопераций.
Некоторые из причин, по которым это может произойти:
- Вы настроили режим чтения, записи и / или последующей записи для кэша;
- У вас есть почти все кэши и / или непрерывные запросы (которые подразумевают слушателей);
- У вас есть индексы (которые необходимо обновлять по мере исчезновения данных);
- и т.д.
Я попрошу несколько предложений о том, как ускорить это.
Обновление (14 июля 2014 г.) — Да, оказывается, что это известная проблема (т. Е. Что Ее можно оптимизировать), но для поддержания как «корректности», так и обратной совместимости оптимизация (которая была бы существенными изменениями) была отложена, и clear() все еще выполняетсяитеративным образом на серверной части.