EHCache обновить - PullRequest
       2

EHCache обновить

11 голосов
/ 19 октября 2010

В EHCache, есть ли способ реализовать своего рода слушатель базы данных, где cahce будет автоматически обновляться, если данные не синхронизированы?(например, как только пользователь запрашивает данные, cahce проверяет, не синхронизированы ли данные, если да ... обновляет себя и возвращает данные, если нет ... просто возвращает данные из кэша) Если кто-то можетУкажите, какая часть спецификации подчеркивает это использование, это было бы здорово!

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

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

Спасибо !!

Ответы [ 2 ]

4 голосов
/ 07 октября 2011

Я сделал это с помощью ehcache-spring-annotations.Это мои зависимости в maven pom.xml

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>3.0.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.2.0</version>
</dependency>
    <dependency>
    <groupId>com.googlecode.ehcache-spring-annotations</groupId>
    <artifactId>ehcache-spring-annotations</artifactId>
    <version>1.2.0-M1</version>
</dependency>

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

package com.company.project.dao;

import java.util.List;

import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Ehcache;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.company.project.domain.Parent;
import com.company.project.domain.Child;

import com.googlecode.ehcache.annotations.Cacheable;
import com.googlecode.ehcache.annotations.KeyGenerator;
import com.googlecode.ehcache.annotations.Property;

@Component("Example")
public class EhcacheExample {

    @Autowired
    @Qualifier("ehCacheManager")
    private FactoryBean<CacheManager>  ehCacheManager;

    public void createParen(Parent parent) {
        cleanCache(parent);
        create(parent);
    }

    private void cleanCache(Parent parent) {
        try {
            CacheManager cacheManager = ehCacheManager.getObject();
            Ehcache ehcache = cacheManager.getEhcache("myCache");
            ehcache.remove(parent.getChild().hashCode());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Cacheable
    (   cacheName = "myCache", 
        keyGenerator = @KeyGenerator (            
            name = "com.company.project.util.ChildCacheKeyGenerator",                
            properties = @Property( name="includeMethod", value="false" )
        )
    )
    public List<SerieRecording> getParentsByChild(Child child) {
        return ...;
    }

    @Override
    public void deleteParentById(long id) {
        Parent parent = findById(id);
        cleanCache(parent);
        delete(parent);
    }

... 
} 

Реализация KeyGenerator может быть:

package com.company.project.util;

import java.io.Serializable;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.company.project.domain.Child;

import com.googlecode.ehcache.annotations.key.AbstractCacheKeyGenerator;


public class ChildCacheKeyGenerator extends AbstractCacheKeyGenerator<Serializable> {

    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public Serializable generateKey(Object... data) {

        if (data[0] instanceof Child) {
            Child child = (Child)data[0];
            return child.hashCode();
        }
        new IllegalArgumentException();
        return null;
    }

}

В конфигурации Spring:

<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" >
    <property name="configLocation" value="classpath:config/ehcache-methods.xml"/>
</bean>

ehcache-Methods.xml:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                        xsi:noNamespaceSchemaLocation="ehcache.xsd">

    <cache name="myCache" eternal="false"
        maxElementsInMemory="12600" overflowToDisk="false" diskPersistent="false"
        timeToIdleSeconds="0" timeToLiveSeconds="1800"
        memoryStoreEvictionPolicy="LRU" />

</ehcache>

Надеюсь, это полезно.

4 голосов
/ 19 октября 2010

Для EhCache это - это то, что, я полагаю, вы ищете.Если вы не хотите выполнять синхронизированное обновление (даже если это простое решение), лучше использовать триггеры или обновление на основе шины сообщений.Вы можете выполнить некоторую статистику и увидеть частоту обновления, как только будет установлен запуск, и переключиться на синхронизированное обновление с частотой, достаточной для удовлетворения Найквиста .

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