mybaits二十二:一级缓存失效的几种情况

/*
     *缓存
     *  一级缓存(本地缓存),sqlSession级别的缓存,一级缓存是一直开启的.
     *      与数据库同一次会话期间查询到的数据会放在本地缓存中。
     *      以后如果需要获取相同的数据,直接从缓存中取,没必要再去查询数据库
     *       
     *      一级缓存的几种失效情况(没有使用到当前一级缓存的情况,效果就是,还需要再向数据库发出查询)
     *          1. sqlSession不同,一个sqlSession是一个一级缓存.不同的sqlSession是不同的一级缓存
     *          2. sqlSession相同,查询条件不同(当前一级缓存中还没有这个数据)
     *          3. sqlSession相同,但两次查询之间执行了增删改操作(这次增删改可能对原来数据有影响)
     *          4. sqlSession相同,手动清除了一级缓存(缓存清空)

     *  二级缓存:(全局缓存)
     */

 

失效情况一:不同的sqlSession

@Test
	public void testFirstLevelCache() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream ins = Resources.getResourceAsStream(resource);
		SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(ins);
		SqlSession openSession = sf.openSession();
		
		try{
			EmployeePlusMapper em = openSession.getMapper(EmployeePlusMapper.class);
			Employee e1 = em.getEmpByDepnos(7369);
			
			// 1. sqlSession不同,一个sqlSession是一个一级缓存.不同的sqlSession是不同的一级缓存
			// 新建的sqlSession
			SqlSession openSession2 = sf.openSession();
			EmployeePlusMapper em2 = openSession2.getMapper(EmployeePlusMapper.class);
			Employee e2 = em2.getEmpByDepnos(7369);
			
			System.out.println(e1 == e2);
			
		}finally{
			openSession.close();
		}
	}

失效情况二:sqlSession相同,查询条件不同

@Test
	public void testFirstLevelCache() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream ins = Resources.getResourceAsStream(resource);
		SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(ins);
		SqlSession openSession = sf.openSession();
		
		try{
			EmployeePlusMapper em = openSession.getMapper(EmployeePlusMapper.class);
			Employee e1 = em.getEmpByDepnos(7369);
			
			// sqlSession相同,	查询条件不一样
			Employee e2 = em.getEmpByDepnos(7499);
			
			System.out.println(e1 == e2);
			
		}finally{
			openSession.close();
		}
	}

失效情况三:sqlSession相同,但两次查询之间执行了增删改操作

@Test
	public void testFirstLevelCache() throws IOException, ParseException{
		String resource = "mybatis-config.xml";
		InputStream ins = Resources.getResourceAsStream(resource);
		SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(ins);
		SqlSession openSession = sf.openSession();
		
		try{
			EmployeePlusMapper em = openSession.getMapper(EmployeePlusMapper.class);
			Employee e1 = em.getEmpByDepnos(7369);
			
			// 执行增加操作
			SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
			Date dd = formatter.parse("2019-04-03");
			Employee employee = new Employee("1","tom","grammer",7902,dd,800.0);
			em.addEmp(employee);
			
			// sqlSession相同,	查询条件也一样
			Employee e2 = em.getEmpByDepnos(7369);
			
			System.out.println(e1 == e2);
			
		}finally{
			openSession.close();
		}
	}

失效情况四:sqlSession相同,手动清除了一级缓存

@Test
	public void testFirstLevelCache() throws IOException, ParseException{
		String resource = "mybatis-config.xml";
		InputStream ins = Resources.getResourceAsStream(resource);
		SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(ins);
		SqlSession openSession = sf.openSession();
		
		try{
			EmployeePlusMapper em = openSession.getMapper(EmployeePlusMapper.class);
			Employee e1 = em.getEmpByDepnos(7369);
			
			// 手动清除一级缓存
			openSession.clearCache();
			
			// sqlSession相同,	查询条件也一样
			Employee e2 = em.getEmpByDepnos(7369);
			
			System.out.println(e1 == e2);
			
		}finally{
			openSession.close();
		}
	}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MyBatis中,一级缓存和二级缓存都是用于提高查询效率和性能的技术。它们在处理大量数据时特别有用,可以减少数据库的访问次数,提高系统的响应速度。 1. 一级缓存(Session级缓存): 一级缓存是在单个会话(session)级别上设置的缓存。当一个会话启动时,MyBatis会为该会话创建一个一级缓存。在这个会话期间,MyBatis会缓存从数据库查询的结果,以便在后续的相同查询中使用,而无需再次访问数据库。这样可以减少数据库的负载,提高查询效率。 一级缓存的特点是仅在当前会话有效,当会话结束或关闭时,缓存将被清除。因此,一级缓存通常用于单个用户或单个应用程序的临时缓存,而不适用于跨多个用户或应用程序的共享缓存。 2. 二级缓存(Mapper级缓存): 二级缓存是在MyBatis的映射文件(Mapper文件)级别设置的缓存。与一级缓存不同,二级缓存是跨多个会话和多个用户的共享缓存。当多个会话同时访问同一个映射文件时,二级缓存可以有效地共享查询结果,减少数据库的负载。 二级缓存的特点是可以在多个会话之间共享,适用于跨多个用户或应用程序的场景。MyBatis提供了多种配置选项来启用和配置二级缓存,例如使用`<cache>`标签在映射文件中启用二级缓存。 需要注意的是,二级缓存的启用需要谨慎使用,因为不当的使用可能会导致数据一致性问题。例如,如果两个会话同时更新同一个记录,可能导致其中一个会话看到的更新结果被另一个会话覆盖。因此,在使用二级缓存时,需要仔细考虑其适用场景和潜在风险。 总结来说,一级缓存和二级缓存都是MyBatis中用于提高查询效率和性能的技术,但它们的使用场景和特点有所不同。一级缓存适用于单个会话的临时缓存,而二级缓存适用于跨多个会话和用户的共享缓存。在使用时需要根据实际情况进行选择和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值