您现在的位置是:网站首页> 内容页

误删 EhCache 中的数据?

  • 亚搏体育官方平台
  • 2019-01-08
  • 463人已阅读
简介最近遇到一个问题:在使用ehcache时,通过CacheManager.getCache(chachename).get(key),获取相应的缓存内对象(当时这个对象是个list),

最近遇到一个问题:在使用ehcache时,通过CacheManager.getCache(chachename).get(key),获取相应的缓存内对象(当时这个对象是个list), 有个同事写个方法使用 removeall 来删除list中不需要的对象,返回剩下的对象组成的list (这里没有put 去更新ehcache)。问题就出现在removeall 这个操作,这个操作把缓存里面的list里的数据也删除了一部分。

查了一下 ehcache 存储机制: 堆内存储再看看ehcache 的源码org.apache.shiro.cache.MapCache 这个类实现了 org.apache.shiro.cache.Cache 这个接口其中put 和 get 这两个方法对应的源码

1 public V get(K key) throws CacheException {2 return map.get(key)3 }4 5 public V put(K key V value) throws CacheException {6 return map.put(key value)7 }

其中map 是 java.util.Map 那么在我的记忆中 map 是就是存在堆栈里面的回顾一下:

1 A a1 = new A();2 A a2 = a1

其实a1 和 a2 指向的同一个堆栈的地址,并不是两个真正的对象,而是两个引用一个对象。

所以在调用ehcache 的时候,put 和 get 是指向堆栈里的同一个地址,get的时候并没有获取到一个新的对象,而是把引用给返回回去;如果直接操作,则会改变ehcache 中的值,当你在别的方法中调用可能就会产生数据的错误,这还是值得注意的。

以上纯属个人观点,如有错误请留言指正,谢谢

文章版权由作者Gonson和博客园共有,若转载请于明显处标明出处:https://www.cnblogs.com/gonson/p/9329531.html 

1 0 9)

文章评论

Top