java – Ehcache丢失对象

我正在使用Ehcache来缓存在我的应用程序中加载非常昂贵的对象.在启动时,我会缓存所有需要的对象,并且每天通过一个单独的进程刷新一次.

但是,似乎在我将对象添加到缓存后不久,它们就消失了.没有任何东西被报告为被驱逐,但由于某种原因,对象不会在缓存中持续存在.当我运行ObjectLoader.loadCache()时,这是我收到的输出

2012-09-01 17:25:37,121 [main] DEBUG ObjectLoader.getobject():65 - ************************************
2012-09-01 17:25:37,121 [main] DEBUG ObjectLoader.getobject():66 - Number of objects in cache: 0
2012-09-01 17:25:37,121 [main] DEBUG ObjectLoader.getobject():72 - Object not in cache | 501
2012-09-01 17:26:17,271 [main] DEBUG ObjectLoader.getobject():80 - Number of objects in cache: 1
2012-09-01 17:26:17,271 [main] DEBUG ObjectLoader.getobject():81 - Number of objects evicted from cache: 0
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getobject():83 - Object key found: 501
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getobject():65 - ************************************
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getobject():66 - Number of objects in cache: 1
2012-09-01 17:26:17,274 [main] DEBUG ObjectLoader.getobject():72 - Object not in cache | 518
2012-09-01 17:26:35,894 [main] DEBUG ObjectLoader.getobject():80 - Number of objects in cache: 1
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getobject():81 - Number of objects evicted from cache: 0
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getobject():83 - Object key found: 518
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getobject():65 - ************************************
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getobject():66 - Number of objects in cache: 1
2012-09-01 17:26:35,895 [main] DEBUG ObjectLoader.getobject():72 - Object not in cache | 516
2012-09-01 17:27:31,997 [main] DEBUG ObjectLoader.getobject():80 - Number of objects in cache: 1
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getobject():81 - Number of objects evicted from cache: 0
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getobject():83 - Object key found: 516
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getobject():65 - ************************************
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getobject():66 - Number of objects in cache: 1
2012-09-01 17:27:31,998 [main] DEBUG ObjectLoader.getobject():72 - Object not in cache | 515
2012-09-01 17:28:20,343 [main] DEBUG ObjectLoader.getobject():80 - Number of objects in cache: 1
2012-09-01 17:28:20,343 [main] DEBUG ObjectLoader.getobject():81 - Number of objects evicted from cache: 0
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getobject():83 - Object key found: 515
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getobject():65 - ************************************
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getobject():66 - Number of objects in cache: 1
2012-09-01 17:28:20,344 [main] DEBUG ObjectLoader.getobject():72 - Object not in cache | 525
2012-09-01 17:29:05,616 [main] DEBUG ObjectLoader.getobject():80 - Number of objects in cache: 1
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getobject():81 - Number of objects evicted from cache: 0
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getobject():83 - Object key found: 525
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getobject():65 - ************************************
2012-09-01 17:29:05,617 [main] DEBUG ObjectLoader.getobject():66 - Number of objects in cache: 1
2012-09-01 17:29:05,618 [main] DEBUG ObjectLoader.getobject():72 - Object not in cache | 512
2012-09-01 17:29:38,790 [main] DEBUG ObjectLoader.getobject():80 - Number of objects in cache: 1
2012-09-01 17:29:38,790 [main] DEBUG ObjectLoader.getobject():81 - Number of objects evicted from cache: 0
2012-09-01 17:29:38,790 [main] DEBUG ObjectLoader.getobject():83 - Object key found: 512

我是否配置了错误的ehcache,或者我的代码中是否有错误?任何帮助,将不胜感激.谢谢.

我使用的是spring 3.1.0,ehcache-spring-annotations 1.1.2和ehcache 2.4.2

ObjectCacheFacade.java

@Component()
public class ObjectCacheFacade {
    private static final String CACHE_KEY = "myObjectCache";

    @Resource
    private CacheManager cacheManager;
    private Cache cache;

    public ObjectCacheFacade() {
        cacheManager = CacheManager.getInstance();
        this.cache = cacheManager.getCache(CACHE_KEY);
    }

    public Object getobjectFromCache(String objectId) {
        Object result = null;
        Element element = cache.get(objectId);

        if (element != null && element.getValue() != null) {
            result = element.getobjectValue();
        } 

        return result;
    }

    public void putObjectIntoCache(String objectId,Object object) {
        Element element = new Element(objectId,object);
        cache.put(element);
    }

    public int getSize() {
        return cache.getSize();
    }

    public void removeObjectFromCache(String objectId) {
        cache.remove(objectId);
    }

    public void flushCache() {
        cache.removeAll();
    }

    public Cache getCache() {
        return cache;
    }
}

ObjectLoader.java

@Service
public class ObjectLoader {
    private static final Logger log = Logger.getLogger(ObjectLoader.class);

    @Resource
    protected ObjectDao objectDao;
    @Resource
    protected ObjectCacheFacade objectCache;

    public void loadCache() {
        ListetobjectIds();

        for (String objectId : objectIds) {
            loadobject(objectId);
        }
    }

    public Object getobject(String objectId) {
        log.debug("************************************");
        log.debug("Number of objects in cache: " + objectCache.getSize());

        Object object = objectCache.getobjectFromCache(objectId);

        if (object == null) {
            log.debug("Object not in cache | " + objectId);
            object = objectDao.getobject(objectId);

            if (object != null) {
                objectCache.putObjectIntoCache(objectId,object);

                log.debug("Number of objects in cache: " + objectCache.getSize());
                log.debug("Number of objects evicted from cache: " + objectCache.getCache().getCacheEventNotificationService().getElementsevictedCounter());
                for (Object key : objectCache.getCache().getKeys()) {
                    log.debug("Object key found: " + key);
                }
            } 
        } 

        return object;
    }
}

ehcache.xml中

diskStore path="java.io.tmpdir"/>

    etoIdleSeconds="60"
        timetoLiveSeconds="300"
        overflowTodisk="false"
        memoryStoreevictionPolicy="LRU"
       />

    etoIdleSeconds="0"
        timetoLiveSeconds="0"
        overflowTodisk="false"
        diskPersistent="true"
        memoryStoreevictionPolicy="LRU"
       />

applicationContext.xml中

factorybean" />
最佳答案
由于diskPersistent设置为true,因此Ehcache在将对象添加到缓存后尝试将对象写入磁盘.但是,主缓存对象中的一个嵌套对象没有实现Serializable,因此它在磁盘写入时抛出异常,然后从缓存中逐出该对象.这种驱逐没有出现在缓存统计中,因为它没有被memoryStoreevictionPolicy驱逐.

这应该是一个非常容易找到的错误,但该项目不包括slf4j-log4j12库,因此异常被吞下而不是写入日志.一旦正确处理了日志记录,就会立即明白问题是什么.

哦,好吧,生活和学习我猜…

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...