未分类
2020-12-21 10:42:05
1822677238@qq.com
手机扫码查看
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关闭");
}


- 本页地址 https://www.9713job.com/?p=2810
- 上一篇 <<2020java框架教程之Mybatis逆向工程CRUD
- 下一篇 >>2020最新版Git教程



发表回复