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

Mybatis 一级缓存 二级缓存

程序员文章站 2024-03-24 16:32:28
...

mybatis缓存分为一级缓存和二级缓存

  • 一级缓存:

一级缓存存在于 SqlSession 的生命周期中,在同一个 SqlSession 中查询时, MyBatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个 Map对象中。如果同一个 SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当 Map 缓存对象中己经存在该键值时,则会返回缓存中的对象。任何的 INSERT 、UPDATE 、 DELETE 操作都会清空一级缓存。

<!-- 一级缓存关闭:在select标签中添加 flushCache="true"属性-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.kh.server.mapper.CertInfoMapper" >

  <select id="queryListByWhere" parameterType="java.util.Map" flushCache="true">
   
  </select>

</mapper>
  • 二级缓存

二级缓存存在于 SqlSessionFactory 的生命周期中,可以理解为跨sqlSession;缓存是以namespace为单位的,不同namespace下的操作互不影响。二级缓存的全局开关配置:修改配置文件mybatis-config.xml,加入<setting name="cacheEnabled"value=“true”/>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.kh.server.mapper.CertInfoMapper" >

<!-- 启用二级缓存:需要在SQL映射文件中添加如下配置
	 映射语句文件中的所有 select 语句将会被缓存。
	 映射语句文件中的所有 insert,updatedelete 语句会刷新缓存。
	 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
	 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。
	 缓存会存储列表集合或对象(无论查询方法返回什么)512个引用。
	 缓存会被视为是 read/write(可读/可写)的缓存。

	 注意:mybatis的二级缓存容易出现脏读,应避免使用二级缓存。
	 <cache-ref namespace="com.kh.server.mapper.UserInfoMapper""/>
	 cache-ref:表示使用namespace指定的二级缓存,也就是共享一个二级缓存
-->
<cache eviction=“LRU" flushInterval="60000" size="512" readOnly="true"/> 
  <select id="queryListByWhere" parameterType="java.util.Map">
   
  </select>

</mapper>

Mybatis 一级缓存 二级缓存