jfinal缓存中的坑 求解决

jfinal 中Db.findByCache()中我看了底层的实现

public List<Record> findByCache(String cacheName, Object key, String sql, Object... paras) {
   ICache cache = config.getCache();
   List<Record> result = cache.get(cacheName, key);
   if (result == null) {
      result = find(sql, paras);
      cache.put(cacheName, key, result);
   }
   return result;
}

这里其实存储的是引用不是值,我在后来把引用给修改了,我第二次在获取的时候,
获取到的是我修改过后的值,而不是最开始从数据库中查询出来的值。
这点我踩了个大坑。而且我也没有找到Record的克隆的方法,如果手动去一个个的设置值会很麻烦


评论区

JFinal

2018-04-12 20:53

jfinal 的缓存仅仅是对 ehcache 做的极薄封装,而 ehcache 是 JVM 内的缓存,对象本来就是共享的,共享对象也是提升性能的手段之一

有的应用场景,就是希望去更新缓存中的数据,如果从缓存中读数据每次都是是 clone 出来的,那么缓存中的数据永远无法更新,只能 remove 掉

JFinal

2018-04-12 20:54

record 克隆可以使用 new Record.setColumns(record);

yu_chen

2018-04-23 17:13

@JFinal 好的 谢谢啦 但是对于数据库查询这里 很多人都不知道这个问题,因为一般都认为只是数据库级别的缓存是复制了一份的

zerov

2018-08-12 16:54

@JFinal Db.findByCache()3个参数中的key表示什么意思?一直没搞明白

JFinal

2018-08-12 17:14

@zerov findByCache 优先从缓存中取数据,取不到数据才去数据库查询

而从缓存取数据必须要有一个 key, key 就是从数据库取数据的一把钥匙

热门反馈

扫码入社