Mybatis缓存
查询:连接数据库,耗费资源。
可以将一次查询得到的数据暂时保存在可以直接取道的地方。内存。缓存。下次在取数据的时候,直接走缓存,不走数据库,就提高了查询效率。
1.缓存它是内存中的临时数据。不持久。
2.减少了和数据库的交互次数。减少了系统的开销
3.经常查询并且不经常改变的数据。
mybatis 可以配置缓存也可以定制缓存。
Mybatis 中默认定义了两级缓存:
一级缓存
二级缓存
一级缓存
默认情况下,只有一级缓存是开启的,本地缓存,是SqlSession 级别的缓存。默认开启的,无法关闭。
二级缓存
二级缓存是需要手动开启和配置的。是基于namespace级别的缓存。
通过接口 Cache 来定义二级缓存。
二级缓存也叫做全局缓存,一级缓存的作用域太低了。
基于namespace 级别的缓存。一个命名空间对应一个二级缓存。
工作机制:
1.一个回话查询一条数据,这个数据就会被放在当前回话的一级缓存中。
2.当会话被关闭的时候,这个回话对应的一级缓存就没有了,当会话关闭的时候,数据保存在二级缓存中。
3.新的会话查询数据就可以从二级缓存中取到数据,
4.不同的mapper.xml 查询出来的数据会放在自己对应的二级缓存(map)中。
需要实现 Cache 接口
在mybatis核心配置文件中开启二级缓存
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
在需要实现二级缓存的 mapper.xml 中开启
<!-- 开启了二级缓存 这种形式属性都是默认的。-->
<cache/>
但是也有属性:
eviction :FIFO。输入输出
flushInterval:60000 。 每隔60秒刷新
size : 512。最多可以放512个对象
readOnly : 只读
<!-- 开启了二级缓存-->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
在需要使用二级缓存的select 标签中添加 useCache 属性
<select id="findAccountById" parameterType="int" resultType="account" useCache="true">
select * from account where id = #{id}
</select>
测试
// 测试二级缓存
@Test
public void findAccountByIdTestCache(){
SqlSession sqlSession1 = MybatisUtils.getSqlSession();
AccountXMLMapper accountXMLMapper1 = sqlSession1.getMapper(AccountXMLMapper.class);
Account accountById1= accountXMLMapper1.findAccountById(2);
System.out.println(accountById1);
sqlSession1.close();
System.out.println("---------------");
// 修改
// Account account = new Account(1,"MAGIC",1000);
// int i = accountXMLMapper.updateAccount(account);
// System.out.println(i);
// System.out.println("---------------");
// sqlSession.clearCache(); // 手动清除缓存
SqlSession sqlSession2 = MybatisUtils.getSqlSession();
AccountXMLMapper accountXMLMapper2 = sqlSession2.getMapper(AccountXMLMapper.class);
Account accountById2= accountXMLMapper2.findAccountById(2);
System.out.println(accountById2);
sqlSession2.close();
}
报错时注意:看实体类是否实现了 序列化接口。
注意:所有的数据都先会放在一级缓存中,会话关闭或者提交,会将数据转移到二级缓存中。
缓存的顺序:先看二级缓存,在看一级缓存,最后才看数据库。