У нас странная проблема. Мы получаем набор ключей из кэша Oracle Coherence, но не можем напрямую получить значения из кэша, даже если на нем нет операций обновления.
Следующий код последовательно завершается с ошибкой (то есть выводит «>>>> NULL», поскольку объект не извлекается). Вопрос: ПОЧЕМУ?
NamedCache nc = CacheFactory.getCache(cacheName);
Set<Object> keys = (Set<Object>)nc.keySet();
for ( Object key : keys ) {
Object o = nc.get(key);
if ( o == null ) {
System.out.println(">>>>NULL:"+keyStr);
}
}
Кеш - это секционированный именованный кеш с несколькими индексами.
Ключ - это объект (не показан) с одной переменной экземпляра, HashMap.
Ключевой объект также имеет методы equals () и hashCode () следующим образом:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((values == null) ? 0 : values.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
System.out.println("EQUALS");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AbstractCacheKey other = (AbstractCacheKey) obj;
if (values == null) {
if (other.values != null)
return false;
} else if (!values.equals(other.values))
return false;
return true;
}
Я полагаю, что Coherence использует хеш-код объекта сериализованного ключа в этой конфигурации, что сделает эти два метода неактуальными, за исключением того, что я не знаю, что это верно как для фронтального кэша (локальная JVM, локальное хранилище отключено), так и обратно кеш (узел хранения JVM).
Часть нашего кода частично решает эту проблему, перестраивая ключ, вставляя значения в стандартном порядке. Это обычно работает. Я не понимаю, почему это необходимо, поскольку наш метод hashCode () и hashCode () Java для HashMap, AFAIK, нечувствительны к порядку итерации хеша. Почему это обычно, но не всегда работает - тоже загадка.