mybatis|mybatis一级缓存和二级缓存理解与区别

一级缓存 作用域:一级缓存是基于sqlsession默认开启的,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。
一级缓存作用是sqlsession范围的,在同一个sqlsession中执行两次相同的sql时,第一次得到的数据会缓存放在内存中,第二次不再去数据库获取,而是直接在缓存中获取,提高效率。
何时失效:在中间如果执行了增删改并提交到数据库,mybatis是会把sqlsession中的一级缓存清空的,这样是为了数据的准确性,避免脏读现象;当关闭一个sqlsession时,一级缓存也随之消失。
二级缓存 作用域:二级缓存是基于mapper的namespace作用域,但多个sqlsession操作同一个namespace下的sql时,并且传入的参数也相同,执行相同的sql语句,第一次执行完毕后,自动将sql提交会将数据缓存,这就是二级缓存。
底层数据存储:二级缓存是在一级缓存使用HashMap的基础上增加了一层Map进行数据存储。相比一级缓存SqlSession,二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存它是可以跨越多个sqlsession的。
如何开启:开启二级缓存,在MyBatis的全局配置settings中有一个参数cacheEnabled,这个参数是二级缓存的全局开关
在保证二级缓存全局配置开启情况下,给mapper.xml开启二级缓存添加元素即可。
【mybatis|mybatis一级缓存和二级缓存理解与区别】默认的二级缓存会有如下效果:

  • 映射语句文件中的所有SELECT语句将会被缓存。
  • 映射语句文件中所有INSERT、UPDATE、DELETE语句会被刷新缓存。
  • 缓存会使用Least Recently Used 算法来收回。
  • 根据时间表(如 no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新。
  • 缓存会存储集合或对象(无论查询方法返回什么类型的值)的1024个引用。
  • 缓存会被视为read/write(可读/可写)的,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不扰其他调用者或线程所做的潜在修改。

    推荐阅读