为什么会有一二级缓存
为了减少数据库压力,直接的方式就是减少对数据库的调用,通常来讲只要执行sql的调用,就需要访问数据库,那如果能对sql执行的结果进行缓存,相同的sql执行,从缓存中拿结果,这样就可以减轻数据库压力
一级缓存
Mybatis的一级缓存默认情况下是开启的,一级缓存与SqlSession进行绑定,也就是针对SqlSession内的sql进行缓存,不同SqlSession相互之间不影响,缓存使用本地内存实现
一级缓存也分两个级别: SESSION和STATEMENT,默认的缓存级别为SESSION。STATEMENT级别是指缓存针对当前执行的查询有效,故每次执行完就清理缓存,即相当于没有缓存。
关闭一级缓
1.存修改全局配置文件mybatisConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="localCacheScope" value="STATEMENT"/>
...
</settings>
...
</configuration>
2.springboot项目关闭一级缓存
mybatis:
configuration:
local-cache-scope: statement #一级缓存指定为statement级别
二级缓存
二级缓存默认情况下是没有开启的,如果开启二级缓存,支持在配置中自定义底层缓存实现,包括使用本地缓存和分布式缓存
基于namespace即作用域为mapper,故需要在每个mapper中配置二级缓存实现及缓存策略,不同namespace乡宦之间不受影响
1.开启二级缓存
mybatisConfig.xml中开启
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true" />
...
</settings>
...
</configuration>
springboot中开启
mybatis:
configuration:
cache-enabled: true #禁用二级缓存
2.mapper中配置
cache标签配置二级缓存实现方式,也可以不配置,即使用默认实现
<mapper namespace="mapper.xxxMapper">
<!-- Cache 配置 -->
<!-- <cache /> -->
<!-- <cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true" /> -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache" />
</mapper>
指定查询关闭缓存
在select标签中使用useCache="false"
<select id="selectXXX"
useCache="false">
...
</select>
一二级缓存项目中是否使用
虽然一二级缓存可以减少数据库查询操作,但加大了数据不一致的情况存在,故实际项目中建议关闭缓存机制,项目根据需要使用第三方缓存,如Redis等