开发者社区> 问答> 正文

Ehcache使用配置+硬编码实现缓存遇到的问题:报错

目前使用jfinal+Ehcache来开发应用,但是遇到了一个缓存问题。

Ehcache 的使用和配置至少有2种:配置文件+硬编码

这2中,都在项目中使用:配置文件适合缓存名固定的缓存,硬编码针对缓存名称不固定,比如“name + type_id”

2种使用为了灵活方便。

但是我们在硬编码实现时,遇到了一些问题:


CacheManager manager =  CacheKit.getCacheManager();
Cache cache = new Cache("CACHE_"+type.id,10000,false,true,0,0);
cache.setDisabled(false);
cache.initialise();---报错
Element element =  new Element( i, detailIdList,true);
cache.put(element);
manager.addCache(cache);

Exception in thread "Timer-0" java.lang.NullPointerException

  at net.sf.ehcache.Cache.initialise(Cache.java:1072)
  at com.model.topic.Type.initTopicTypeCache(Type.java:100)
  at com.systemConfig.SystemConfig$1.run(SystemConfig.java:209)
  at java.util.TimerThread.mainLoop(Timer.java:555)
  at java.util.TimerThread.run(Timer.java:505)

查看Cache.initialise 方法:


分析源码,应该是Cache构造实例时候,造成的:loader 为空造成的,但是具体的解决原因暂时还没有找到,请过来人指点迷津,不胜感激!







展开
收起
kun坤 2020-06-20 13:45:46 37753 0
1 条回答
写回答
取消 提交回答
  • 引用来自“hanzhankang”的评论



    CacheManager manager =  CacheKit.getCacheManager();
    Cache cache = new Cache("CACHE_"+type.id,10000,false,true,0,0);
    manager.addCache(cache);
    
    Element element =  new Element( i, detailIdList,true);
    cache.put(element);



    如此才是正确的操作方法: Cache 在加入 CacheManager 之前是不能使用的。


    但是新问题又出现了:我无法加入多个元素!比如:

    Element elementPage1 =  new Element( i+"", pageNumStr,true);
    cache.put(elementPage1);
    Element elementPage2 =  new Element( pageNumStr,i+"",true);
    cachePage.put(elementPage2);

    这样存入,始终是 elementPage2 替换 elementPage1 ,而我是想要插入操作。。。。好多坑!









    因为我将此数据放置在for循环中了,每次都new一个缓存,导致在缓存中只能是一个值,所以是代码问题。

    使用时确实是需要先将cache加入到CacheManager中才可以继续操作!

    ######看了一个帖子: 在每新create一个Cache时, 都要设置下setBootstrapCacheLoader,这个BootstrapCacheLoader是干啥的? 

    cache类里有个bootstrap方法,这里将调用bootstrapCacheLoader.load(Cache)方法。

    现在来看只有RMIBootstrapCacheLoader类实现了BootstrapCacheLoader接口,又是跟集群有关,先不用考虑。

    http://rmn190.iteye.com/blog/369073

    目前我的Ehcache是2.8.3,BootstrapCacheLoader 有:DiskStoreBootstrapCacheLoaderMemoryLimitedCacheLoaderRMIBootstrapCacheLoaderTerracottaBootstrapCacheLoader 4种实现类



    ######


    CacheManager manager =  CacheKit.getCacheManager();
    Cache cache = new Cache("CACHE_"+type.id,10000,false,true,0,0);
    manager.addCache(cache);
    
    Element element =  new Element( i, detailIdList,true);
    cache.put(element);



    如此才是正确的操作方法: Cache 在加入 CacheManager 之前是不能使用的。


    但是新问题又出现了:我无法加入多个元素!比如:

    Element elementPage1 =  new Element( i+"", pageNumStr,true);
    cache.put(elementPage1);
    Element elementPage2 =  new Element( pageNumStr,i+"",true);
    cachePage.put(elementPage2);

    这样存入,始终是 elementPage2 替换 elementPage1 ,而我是想要插入操作。。。。好多坑!









    2020-06-20 13:45:57
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
基于英特尔 SSD 的虚拟机缓存解决SSD 立即下载
用户态高速块缓存方案 立即下载
高性能Web架构之缓存体系 立即下载