Mybatis缓存的二级缓存

像大多数的持久化框架一样,Mybatis 也提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能。但是只适用于以下这两种数据:1、经常查询并且不经常改变的数据。2、数据的正确与否对最终结果影响不大的。例如:商品的库存,银行的汇率,股市的牌价等就不能使用Mybatis缓存。 Mybatis 中缓存分为一级缓存,二级缓存。上次说的是一级缓存,这次就来说一下二级缓存。
在这里插入图片描述

2.Mybatis 二级缓存
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个 SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。
在这里插入图片描述

首先开启 mybatis 的二级缓存。
sqlSession1 去查询用户信息,查询到用户信息会将查询数据存储到二级缓存中。
如果 SqlSession3 去执行相同 mapper 映射下 sql,执行 commit 提交,将会清空该 mapper 映射下的二 级缓存区域的数据。 sqlSession2 去查询与 sqlSession1 相同的用户信息,首先会去缓存中找是否存在数据,如果存在直接从 缓存中取出数据。

2.2二级缓存的开启与关闭
2.2.1第一步:在 SqlMapConfig.xml 文件开启二级缓存

因为 cacheEnabled 的取值默认就为 true,所以这一步可以省略不配置。为true代表开启二级缓存;为false代表不开启二级缓存。

2.2.2第二步:配置相关的 Mapper 映射文件
标签表示当前这个mapper映射将使用二级缓存,区分的标准就看mapper的namespace值。

<?xml version="1.0" encoding="UTF-8"?> 2.2.3第三步:配置 statement 上面的 useCache 属性 select * from user where id = #{uid}
将 UserDao.xml映射文件中的<select>标签中设置useCache=“true”代表当前这个statement要使用二级缓存,如果不使用二级缓存可以设置为false。

注意:针对每次查询都需要最新的数据sql,要设置useCache=“false”,禁用二级缓存。

2.3二级缓存测试
public class SecondLevelCacheTest {
private InputStream in;
private SqlSessionFactory factory;
@Before//用于在测试方法执行之前执行
public void init()throws Exception{
//1.读取配置文件,生成字节输入流
in= Resources.getResourceAsStream(“SqlMapConfig.xml”);
//2.获取SqlSessionFactory
factory = new SqlSessionFactoryBuilder().build(in);
}
@After//用于在测试方法执行之后执行
public void destroy()throws Exception{
in.close();
}

/**
 * 测试一级缓存
 */
@Test
public void testFirstLevelCache(){
    SqlSession sqlSession1 = factory.openSession();
    IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);
    User user1 = dao1.findById(1);
    System.out.println(user1);
    sqlSession1.close();//一级缓存消失
    SqlSession sqlSession2 = factory.openSession();
    IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);
    User user2 = dao2.findById(1);
    System.out.println(user2);
    sqlSession2.close();
    System.out.println(user1 == user2);
}

}

经过上面的测试,我们发现执行了两次查询,并且在执行第一次查询后,我们关闭了一级缓存,再去执行第二 次查询时,我们发现并没有对数据库发出 sql 语句,所以此时的数据就只能是来自于我们所说的二级缓存。
需要注意的是:当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化方式来保存对象。

2.2.4 二级缓存注意事项
当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化 方式来保存对象。

public class User implements Serializable {
private Integer id;
private String username;
private String address;
private String sex;
private Date birthday;
}
Mybatis一级缓存跟二级缓存有所相同又有所不同,所要注意的地方也有些不一样要特别注意哦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值