目录
什么是缓存?
一级缓存
实例效果
二次缓存
示例效果
什么是缓存?
在用户访问相同数据时,需要对数据库多次访问,导致产生大量IO、读写硬盘的操作,效率低下,有了缓存首次访问时,查询到数据库数据库,将数据库存储到缓存中,再次访问时,直接访问缓存减少IO的与赢哦读写,提高效率
一级缓存
是指同一个sqlsession发起的多次同构查询,会将数据保存在一级缓存中
实例效果
@Test
public void OneText(){
SqlSession session = MyBatisUtils.getSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.selectById(1);
System.out.println(user);
System.out.println("-------一级缓存-------");
SqlSession session1 = MyBatisUtils.getSession();
UserDao mapper = session.getMapper(UserDao.class);
User user1 = mapper.selectById(1);
System.out.println(user1);
}
二次缓存
是指只要sqlSessionFactory是同一个即可取出缓存
注意事项:对事务进行提交或关闭才能有二级缓存
@Test
public void TwoText(){
SqlSession session = MyBatisUtils.getSession();
UserDao userDao = session.getMapper(UserDao.class);
User user = userDao.selectById(1);
session.close();sqlSession2.close(); //缓存未击中,重新查询数据库、重新缓存
SqlSession session3 = MyBatisUtils.getSession();
UserDao mapper2 = session3.getMapper(UserDao.class);
User user3=new User();
user3.setId(2);
user3.setSex("333");
user3.setPassword("000");
user3.setName("@@@");
mapper2.updateUser(user3);
session3.commit();
session3.close();
System.out.println("------二级缓存开始-------");
SqlSession session1 = MyBatisUtils.getSession();
UserDao mapper = session1.getMapper(UserDao.class);
User user1 = mapper.selectById(1);
session1.close();//关闭才能产生缓存
System.out.println("------二级缓存继续------");
SqlSession session2 = MyBatisUtils.getSession();
UserDao mapper1 = session2.getMapper(UserDao.class);
User user2 = mapper1.selectById(1);
session2.close();
System.out.println("------我们继续二级缓存------");
SqlSession session4 = MyBatisUtils.getSession();
UserDao mapper3 = session4.getMapper(UserDao.class);
User user4 = mapper3.selectById(1);
session4.close();
System.out.println(user4);
}