Mybatis 的一级缓存和二级缓存

一级缓存

在这里插入图片描述

1.定义

  • 一级缓存基于 sqlSession 默认开启,在操作数据库时需要构造 SqlSession 对象,在对象中有一个 HashMap 用于存储缓存数据。不同的 SqlSession 之间的缓存数据区域是互相不影响的。一级缓存的作用域是 SqlSession 范围的,当在同一个 sqlSession 中执行两次相同的 sql 语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。

  • 需要注意的是,如果 SqlSession 执行了 DML 操作(增删改),并且提交到数据库,MyBatis 则会清空 SqlSession 中的一级缓存,这样做的目的是为了保证缓存中存储的是最新的信息,避免出现脏读现象。

  • 当一个 SqlSession 结束后该 SqlSession 中的一级缓存也就不存在了。关闭一级缓存后,再次访问,需要再次获取一级缓存,然后才能查找数据,否则会抛出异常。

2.一级缓存的生命周期有多长?

  • MyBatis 在开启一个数据库会话时,会 创建一个新的 SqlSession 对象,SqlSession 对象中会有一个新的 Executor 对象。Executor 对象中持有一个新的 PerpetualCache 对象;当会话结束时,SqlSession 对象及其内部的 Executor 对象还有 PerpetualCache 对象也一并释放掉。

  • 如果 SqlSession 调用了 close () 方法,会释放掉一级缓存 PerpetualCache 对象,一级缓存将不可用。

  • 如果 SqlSession 调用了 clearCache (),会清空 PerpetualCache 对象中的数据,但是该对象仍可使用。

  • SqlSession 中执行了任何一个 update 操作 (update ()、delete ()、insert ()) ,都会清空 PerpetualCache 对象的数据,但是该对象可以继续使用


二级缓存

在这里插入图片描述

1.二级缓存是 mapper 级别的缓存

  • 使用二级缓存时,多个 SqlSession 使用同一个 Mapper 的 sql 语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用 HashMap 进行数据存储。相比一级缓存 SqlSession,二级缓存的范围更大,多个 Sqlsession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

  • 二级缓存的作用域是 mapper 的同一个 namespace。不同的 sqlSession 两次执行相同的 namespace 下的 sql 语句,且向 sql 中传递的参数也相同,即最终执行相同的 sql 语句,则第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询会从缓存中获取数据,不再去底层数据库查询,从而提高效率。

  • 二级缓存是 mapper 级别的缓存, 多个 SqlSession 去操作同一个 Mapper 的 sql 语句,多个 SqlSession 去操作数据库得到数据会存在二级缓存区域,多个 SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。 二级缓存是多个 SqlSession 共享的,其作用域是 mapper 的同一个 namespace,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。

  • Mybatis 默认没有开启二级缓存需要在 setting 全局参数中配置开启二级缓存。

  • 缓存会使用默认的 Least Recently Used(LRU,最近最少使用的)算法来收回。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章