Можно ли когда-нибудь разработать этот сценарий использования в ehcache? - PullRequest
5 голосов
/ 06 января 2012

Я хочу использовать ehcache не только как кеш, но и как контейнер грязных объектов, которые я хочу сбрасывать в мою базу данных, когда объекты выселяются / истекают.во время обычной обработки я использую ключ для поиска в ehcache.если ключа нет, я читаю данные из базы данных и помещаю их в ehcache.значение на самом деле сложный объект, который я изменяю.когда возникает условие ttl / idle time / overflow, я вижу, что обратные вызовы CacheEventListener запускаются.но есть большая проблема.notifyElementExpired вызывается после удаления значения ключа из кэша.таким образом, есть условие гонки.если я выполняю задачу сброса грязного значения в кэш в notifyElementExpired и в то же время в другом потоке происходит чтение по тому же ключу, то возникает проблема синхронизации.2-й поток не найдет объект в ehcache и, следовательно, перейдет в базу данных, пока другой поток все еще готов к сбросу.

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

есть ли здесь решение ??

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

спасибо

1 Ответ

1 голос
/ 10 июля 2014

Если у вас все в порядке с кешем в памяти, я бы предложил расширить CacheLoader библиотеки Google Guava , например:

public class DBLoader extends CacheLoader<String, String> {

    @Override
    public String load(String key) throws Exception {
        // load a value from the database
        return value;
    }
}

Затем использовать что-то вроде:

private LoadingCache<String, String> dbCache = CacheBuilder.newBuilder()
.expireAfterWrite(CACHE_EXPIRE_IN_SECONDS, TimeUnit.SECONDS)
.build(new DBLoader());

String value = dbCache.get(someKey);


Вам, конечно, придется привести в порядок правильную обработку исключений.

Я считаю, что guava намного проще, чем правильно настроить ehcache.

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