Как использовать контроль версий элементов в экземпляре EHCache? - PullRequest
4 голосов
/ 30 июня 2010

Я кэширую объекты, которые отправляются в мой компонент асинхронным способом.Другими словами, порядок, в котором поступают эти объекты, непредсказуем.Чтобы избежать каких-либо проблем, я включил атрибут версии в мои объекты (который в основном является временной меткой).Идея состоит в том, что любой объект, который прибывает с версией, которая старше, чем та, которая уже была кэширована, он может быть отброшен.

Класс EHCache «Элемент» (который оборачивает объекты в EHCache), кажется,Облегчить это: кроме ключа и значения конструктор может принимать (длинную) версию.Я не могу сделать эту работу так, как я ожидаю, что она будет работать, хотя.Следующий фрагмент кода демонстрирует мою проблему (с использованием EHCache 2.1.1):

public static void main(String[] args) {
    final CacheManager manager = CacheManager.create();
    final Cache testCache = new Cache(new CacheConfiguration("test", 40));
    manager.addCache(testCache);

    final String key = "key";
    final Element elNew = new Element(key, "NEW", 2L);
    testCache.put(elNew);
    final Element elOld = new Element(key, "OLD", 1L);
    testCache.put(elOld);

    System.out.println("Cache content:");
    for (Object k : testCache.getKeys()) {
        System.out.println(testCache.get(k));
    }
}

Я ожидаю, что приведенный выше код вызовет кеширование значения «NEW», вместо этого будет напечатано «OLD».Если вы немного поиграете с порядком, в котором вставляются элементы, вы обнаружите, что последний, который был вставлен, - это тот, который останется в кэше.Управление версиями игнорируется.

Правильно ли я использую функцию управления версиями или, возможно, она не предназначена для этой цели?Кто-нибудь может порекомендовать альтернативы?

1 Ответ

2 голосов
/ 18 марта 2014

EhCache, очевидно, игнорирует значение поля version - его значение определяется пользователем. Поэтому EhCache перезаписывает вашу версию 2L версией 1L, не зная, что означают номера версий.

см. 1) http://jira.terracotta.org/jira/browse/EHC-765

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

А 2) http://jira.terracotta.org/jira/browse/EHC-666

[...] Я бы предпочел решение, предложенное Мареком, чтобы мы предоставили пользователь полностью контролирует атрибут версии и не изменяет его вообще внутренне. Это предотвращает какое-либо влияние на производительность для большей части пользователей, и позволяет пользователю гибко использовать его как они считают нужным. [...]

Как договорились с Грегом по электронной почте, я исправил это как за мой последний комментарий.


Полагаю, что использование поля version может привести к гоночным условиям, в результате чего один поток перезаписывает последнюю версию элемента кэша более ранней версией. Поэтому в моем приложении есть счетчик, который отслеживает самую последнюю версию базы данных, и когда я загружаю кэшированное значение с полем version, отличным от самого последнего-значения-базы-версии-версии, я знаю что кэшированное значение может быть устаревшим и игнорировать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...