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,update 和 delete 语句会刷新缓存。
缓存会使用 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>