海阔天空

当前时间为:
欢迎大家来到海阔天空https://www.9713job.com,广告合作以及淘宝商家推广请微信联系15357240395

2020java框架教程之mybatis缓存

未分类
2020-12-21 10:42:05
1822677238@qq.com

手机扫码查看

2020java框架教程之mybatis缓存

2020java框架教程之mybatis缓存

一级缓存:

是session级别的缓存,一级缓存默认存在。
当在同一个session范围执行查询的时候,如果执行相同的查询,那么第二次查询会从缓存中获取数据

测试1:

@Test
public void testSelectUsersCacheLevelOne1(){
    SqlSession ss = MybatisUtils.getSqlSession();
    UsersMapper um = ss.getMapper(UsersMapper.class);
    Users users1 = um.selectByPrimaryKey(1);
    System.out.println("结果已查询");
    Users users2 = um.selectByPrimaryKey(1);
    System.out.println("结果已查询:从缓存中获取数据");
    ss.close();
    System.out.println("session关闭");
}


测试2:

如果两次查询之间有增删改操作,sqlsession缓存区会被自动清空,下一次查询会重新执行sql语句

@Test
public void testSelectUsersCacheLevelOne2(){
    SqlSession ss = MybatisUtils.getSqlSession();
    UsersMapper um = ss.getMapper(UsersMapper.class);
    Users users1 = um.selectByPrimaryKey(1);
    System.out.println("结果已查询");
    users1.setMobile("888");
    um.updateByPrimaryKey(users1);
    System.out.println("刷新缓存");
    Users users2 = um.selectByPrimaryKey(1);
    System.out.println("重新执行查询");
    ss.commit();
    ss.close();
    System.out.println("session关闭");
}



二级缓存

默认不开启,在不同的session范围内,执行相同的数据查询,每次查询将会执行独立的数据库检索过程。

测试1:

@Test
public void testSelectUsersCacheLevelTwo1(){
    SqlSession ss1 = MybatisUtils.getSqlSession();
    UsersMapper um1 = ss1.getMapper(UsersMapper.class);
    Users users1 = um1.selectByPrimaryKey(1);
    System.out.println("结果已查询");
    ss1.close();
    SqlSession ss2 = MybatisUtils.getSqlSession();
    UsersMapper um2 = ss2.getMapper(UsersMapper.class);
    Users users2 = um2.selectByPrimaryKey(1);
    System.out.println("结果已查询:重新查询数据库");
    ss2.close();
    System.out.println("session关闭");
}


开启二级缓存:

1.在UsersMapper.xml添加 <cache/>
2.在实体类中实现序列化Serializable接口

测试2:

@Test
public void testSelectUsersCacheLevelTwo2(){
    SqlSession ss1 = MybatisUtils.getSqlSession();
    UsersMapper um1 = ss1.getMapper(UsersMapper.class);
    Users users1 = um1.selectByPrimaryKey(1);
    System.out.println("结果已查询");
    ss1.close();
    SqlSession ss2 = MybatisUtils.getSqlSession();
    UsersMapper um2 = ss2.getMapper(UsersMapper.class);
    Users users2 = um2.selectByPrimaryKey(1);
    System.out.println("结果已查询:从缓存中获取数据,缓存命中率是0.5");
    ss2.close();
    System.out.println("session关闭");
}


测试3:

如果开启了二级缓存,和一级缓存相同,如果两次查询之间有增删改操作,二级缓存区会被自动清空,下一次查询会重新执行sql语句

@Test
public void testSelectUsersCacheLevelTwo3(){
    SqlSession ss1 = MybatisUtils.getSqlSession();
    UsersMapper um1 = ss1.getMapper(UsersMapper.class);
    Users users1 = um1.selectByPrimaryKey(1);
    System.out.println("结果已查询");
    users1.setMobile("888");
    um1.updateByPrimaryKey(users1);
    System.out.println("刷新缓存");
    ss1.commit();ss1.close();
    SqlSession ss2 = MybatisUtils.getSqlSession();
    UsersMapper um2 = ss2.getMapper(UsersMapper.class);
    Users users2 = um2.selectByPrimaryKey(1);
    System.out.println("结果已查询。缓存被刷新,重新查询");
    ss2.close();
    System.out.println("session关闭");
}


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注