误删 EhCache 中的数据?
2024-09-04 15:20:42
最近遇到一个问题:在使用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 这两个方法对应的源码
public V get(K key) throws CacheException { return map.get(key); } public V put(K key, V value) throws CacheException { return map.put(key, value); }
其中map 是 java.util.Map, 那么在我的记忆中 map 是就是存在堆栈里面的
回顾一下:
A a1 = new A(); A a2 = a1;
其实a1 和 a2 指向的同一个堆栈的地址,并不是两个真正的对象,而是两个引用一个对象。
所以在调用ehcache 的时候,put 和 get 是指向堆栈里的同一个地址,get的时候并没有获取到一个新的对象,而是把引用给返回回去;如果直接操作,则会改变ehcache 中的值,当你在别的方法中调用可能就会产生数据的错误,这还是值得注意的。
以上纯属个人观点,如有错误请留言指正,谢谢
文章版权由作者Gonson和博客园共有,若转载请于明显处标明出处:https://www.cnblogs.com/gonson/p/9329531.html
最新文章
- Linux下的Apache和PHP安全设置,如何开启PHP的安全模式
- webbench 压力测试
- %1$s,%2$s等的用法
- Jmeter在restful风格接口测试中的应用
- Entity Framework 第九篇 关于自增列的事务处理
- DOMContentLoaded和load
- Oracle数据库名、实例名、数据库域名、数据库服务名、全局数据库名的辨析
- http报头正文开头会有一个整数的问题
- maven配置编译路径
- 解决ie8不兼容jquery trim问题
- tcl/tk实例详解——glob使用例解
- IOS网络开发实战(二)
- Prolog学习:基本概念 and Asp.net与Dojo交互:仪器仪表实现
- 输出一个string的所有排列情况
- SQL Server 索引维护sql语句
- css padding和margin的百分比
- iOS-Xcode编码自动补全失效
- 安全测试学习之bWAPP环境搭建
- ln 链接命令 简要说明 软硬链接关系说明
- 实现instanceof关键字