MyBatis二级缓存的笔记及记录

2022-10-14,,,

   由于一级缓存是一次性的、临时的;每个会话都会创建一个新的;多个会话之间是不能共享的;

  二级缓存用于解决一级缓存的不足;每一个“namespace”都会对应一个二级缓存;执行查询的时候先在二级缓存中查找,如果没有再到一级缓存中查找,如果都没有就在db中获取;会话关闭后才会同步到二级缓存,没有关闭的情况下是不会同步到二级缓存中的;

  • 二、二级缓存开启方式:

  在接口中添加@cachenamespace注解即可,注意:这里有个坑,在接口文件中添加注解,与xml配置文件中添加属性是不一样的。这个问题只有在后期研究源码时再分析一下;

  • 三、@cachenamespace注解说明:

  1)readwrite:读写模式,true:必须实现序列化接口;

  2)flushinterval:刷新时间,单位:毫秒;这里的刷新是指缓存数据的有效期;

  3)implementation:缓存实现自定义对象;

  4)eviction:缓存策略的算法;

  5)size:是引用的缓存结果,这里是指1024次查询的结果,是序列化之后的结果;

  6)blocking:防止缓存击穿,对应的实现类:blockingcache.putobject;

  • 四、使用条件

  1)会话提交关闭之后才能填充二级缓存;

  2)必须在同一个命名空间下——namespace必须一致;

  3)必须是相同的statement,即同一个mapper中的同一个方法;

  4)必须是相同的sql语句和参数;

  5)如果readwrite=true(@cachenamespace(readwrite=true)),实体对象必须实现序列化(serializable)接口;注意:true与false的区别在于性能,但是也可以忽略不计;

  • 五、清除二级缓存的条件

  1)xml中配置的update不能清空@cachenamespace中的缓存对象;

  2)只有修改会话提交后才会执行清空操作;

  3)任何一种增删改操作都会清空整个namespace中的缓存;

 

后续可能持续更新

 

《MyBatis二级缓存的笔记及记录.doc》

下载本文的Word格式文档,以方便收藏与打印。