MyBatis的一级缓存_二级缓存

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使用二级缓存。


	<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则不会刷新。

你可能感兴趣的:(Mybatis)