欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis二级缓存的笔记及记录

程序员文章站 2022-07-02 12:52:03
一、什么是二级缓存: 由于一级缓存是一次性的、临时的;每个会话都会创建一个新的;多个会话之间是不能共享的; 二级缓存用于解决一级缓存的不足;每一个“namespace”都会对应一个二级缓存;执行查询的时候先在二级缓存中查找,如果没有再到一级缓存中查找,如果都没有就在DB中获取;会话关闭后才会同步到二 ......
  • 一、什么是二级缓存:

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

  二级缓存用于解决一级缓存的不足;每一个“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二级缓存的笔记及记录