Mybatis查询缓存
- 缓存技术是一种“以空间换时间”的设计理念,是利用内存空间资源来提高数据检索速度的有效手段之一。
- MyBatis包含一个非常强大的查询缓存特性,可以非常方便地配置和定制。
- mybaits提供一级缓存,和二级缓存。
- 一级缓存基于 PerpetualCache(永久缓存)的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
- 二级缓存与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace也称application),并且可自定义存储源,如 Ehcache、Hazelcast等。
一级缓存
mybatis默认支持一级缓存,不需要在配置文件去配置。
二级缓存
- mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存。
-
- 在核心配置文件SqlMapConfig.xml中加入
<setting name="cacheEnabled" value="true"/>
- 在OrdersMapper.xml中开启二缓存
<mapper namespace="net.neuedu.mybatis.mapper.UserMapper">
<cache></cache>
- Pojo类必须实现序列化接口
public class Orders implements Serializable{
private Integer id;
private Users user;
private String orderId;
private Date createtime;
private String note;
private List<OrderDetail> orderDetails;
测试二级缓存:
public static void main(String[] args) throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis/mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();//打开一个SqlSession
UserMapper mapper = session.getMapper(net.neuedu.mybatis.mapper.UserMapper.class);
Users user = mapper.queryUserById(4);//查询用户id为4的信息
System.out.println(user.toString());//打印user的信息
session.close();//关闭SqlSession
SqlSession session2 = factory.openSession(); //打开一个新的SqlSession
UserMapper mapper2 = session2.getMapper(net.neuedu.mybatis.mapper.UserMapper.class);
Users user2 = mapper2.queryUserById(4); //再次查询用户id为4的信息,发现SQL语句只执行一次
System.out.println(user2.toString());//打印user的信息
}
当前语句禁用二级缓存
在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。
<!-- public Users queryUserById(Integer id);当前语句禁用二级缓存 useCache="false"-->
<select id="queryUserById" parameterType="int" resultType="users" useCache="false">
select * from t_user where id=#{id}
</select>
加上useCache="false"之后再次执行上面的测试代码,那么这个条select语句就不会进行二级缓存,SQL语句就会执行两次,即是访问了两次数据库。
刷新缓存
- 在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。
- 设置statement配置中的flushCache=“true” 属性,默认情况下为true即刷新缓存,如果改成false则不会刷新。