简介

j2cache是开源两级缓存框架,可降低缓存网络开销
L1(一级缓存):caffeine或者ehcache
L2(二级缓存):redis或者memcached

没有完美的解决方案,方案解决了一些问题,也会带来另一些问题

j2cache带来的问题/局限

说到缓存必然要考虑数据一致性的问题

二级缓存默认的有效期是永久的,采用LRU算法清理缓存。缓存的key为sql查询语句,值为查询结果。

那么缓存什么时候更新呢?
当这个mapper执行修改操作,会清除此Mapper的查询缓存,当然,得走的是同一个sqlSessionFactory才能监控到。

**这会带来一个问题 **
例如我在UserMapper中的某个查询关联dept表查询部门名称,而在这之前通过deptMapper更新了部门名称,deptMapper中的查询缓存刷新了,但是UserMapper中关联dept的查询的缓存并未清除,此时调用会命中缓存,导致查询的部门名称数据不一致。

如何解决

  • 对于关联查询不使用此缓存机制,通过添加注解@Options(useCache = false)
  • 自定义注解标识关联的其他Mapper,当他们更新时通知我更新缓存
    参考实现1
    参考实现2