MyBatis-开启缓存
1、一级缓存:
MyBatis默认开启了一级缓存,一级缓存是在sqlSession层面进行缓存的。 即同一个SqlSession多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接从缓存中直接取出,不会直接查询数据库。
但是不同的SqlSession对象,因为不同的SqlSession都是相互隔离的,所以相同的Mapper、参数和方法,它还是会再次发送。
2、二级缓存:
为了克服一级缓存不同SqlSession对象引发的问题,需要开启二级缓存。二级缓存是缓存的zaiSqlSessionFactory层m面给各个SqlSession对象共享。默认二级缓存是不开启的,需要手动开启。
2.1 、开启二级缓存的配置:
在xx-mapper.xml文件中配置:
<!-- 开启二级缓存(默认参数) --> <cache/>
默认的参数属性:
-
-
- 映射文件的所有的 select、insert、update和delete语句会刷新缓存
- 缓存会使用默认的 Least Recently Used(LRU,最近最少使用原则)的算法回收缓存空间
- 根据时间表,比如 No Flush Interval,(CNFI,没有刷新间隔),缓存不会以任何时间顺序来刷新
- 缓存会存储列表集合或对象(无论查询方法还回什么)的1024个引用
- 缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索是不共享的,而且可以很安全的被调用者修改,不干扰其它调用者调用或现成的潜在修改。
-
自定义二级缓存参数:
<!-- 开启二级缓存 -->
<cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>
二级缓存的各个参数属性:
-
-
- eviction:缓存回收策略:
-
- LRU:最少使用原则,移除最长时间不用的对象
- FIFO:先进先出原则,按照对象进入缓存的顺序进行回收
- SOFT:软引用,移除基以垃圾回收器和软引用规则的对象
- WEAK:弱引用,更积极的移除基以垃圾回收器和软引用规则的对象
- flushInterval:刷新时间间隔,单位为毫秒。如果不配置,那么只进行数据可修改操作才会被动刷新缓存区
- size:引用额数目,代表缓存的最多可以存储的对象个数
- readOnly:是否可读,如果为true,则所有的sql语句还回同一个对象(有助于提高性能,但操作同一条数据时,可能不安全),如果是false,则相同的SQL语句后面访问cache的clone副本
可以在Mapper的具有方法下设置对二级缓存的访问意愿:
-
-
- userCache配置:
-
如果一条语句每次都需要最新的数据,就意味着每次都需要从数据库查询数据,可以把这个属性设置为false,如:
<select id="selectAll" resultMap="BaseResultMap" useCache="false">
-
-
-
flushCache刷新缓存(就是清空缓存)
-
-
二级缓存默认会在insert、update、delete操作后刷新缓存,可以手动配置不更新缓存,如下:
<update id="updateById" parameterType="User" flushCache="false" />