Mybaits一级缓存和二级缓存分别是什么,区别是什么?


前言

        在学习mybatis学习中认识了缓存机制,它可以提高数据的存储效率,但是缓存也存在一些不足之处,所以,在使用缓存的时候需要我们对缓存有足够的了解,能够在合适的位置设置缓存,提高代码的运行效率。


一、什么是缓存

        缓存(cache),数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在缓冲区中,应用程序从缓冲区读取数据。

        特点:数据库取出的数据保存在内存中,具备快速读取和使用。

        限制:读取时无需再从数据库获取,数据可能不是最新的;

缓存的术语:

                命中:需要的数据在缓冲区中找到,

                未命中:需要的数据在缓冲区中未找到

既然缓存有一些缺陷,因此,我们就应该,了解缓冲的使用场景,从缓存的特点就可以分析出 ,

        适合使用缓存:
经常查询并且不经常改变的
数据的正确与否对最终结果影响不大的
比如:一个公司的介绍,新闻等

        不适合用于缓存:
经常改变的数据
数据的正确与否对最终结果影响很大
比如商品的库存,股市的牌价等

二、一级缓存

        一级缓存属于mybatis中会话 session 级别的缓存,针对一次会话操作内;同一次会话期间只要查询过的数据都会保存在当前SqlSessiion的一个Map中

一级缓存失效的四种情况:

        1.当调用sqlsession的修改,添加,删除操作后,调用commit(),close() 等方法时就会清空一级缓存。

        2.不同的SqlSession对应不同的一级缓存 

        3.同一个SqlSession但是查询条件不同

        4.同一个SqlSession两次查询期间手动清空了缓存

public class Demo01 {
	public static void main(String[] args) {
		SqlSession sqlSession = DaoUtil.getSqlSession();
		studentmapper mapper = sqlSession.getMapper(studentmapper.class);
		
		
		Student student = mapper.findStudentBySid(1);
		System.out.println(student);
		System.out.println("=======================================");
		SqlSession sqlSession2 = DaoUtil.getSqlSession();
		studentmapper mapper2 = sqlSession2.getMapper(studentmapper.class);
		Student student2 = mapper2.findStudentBySid(1);
		System.out.println(student2);
		DaoUtil.closeAllResource(sqlSession);
	}

}

运行结果:

 可以看到不同的SqlSession对象会导致一级缓存失效

可以看到执行提交或者回滚事务后都会造成缓存清除 

一级缓存的配置


<setting name="localCacheScope" value="SESSION"/>

        localCacheScope : 表示配置一级缓存
        SESSION
        默认是 session 级别的缓存;
        STATEMENT
        statement 级别的缓存。

 

 

 

一级缓存的工作流程

  1. 对于某个 Select Statement,根据该 Statement 生成 key;
  2. 判断在Local Cache中,该key是否用对应的数据存在;
  3. 如果命中,则跳过查询数据库,继续往下走;
  4. 如果没命中,去数据库中查询数据,得到查询结果;
  5. 将key和查询到的结果作为 key 和value,放入Local Cache 中;
  6. 将查询结果返回;
  7. 判断缓存级别是否为 STATEMENT级别,如果是的话,清空本地缓存

三、二级缓存

2.1.二级缓存—mapper.xml

配置步骤:
1.在mybatis的sqlMapConfig.xml 中配置
2.在mybatis的sqlmap中配置(mapper.xml中配置)
3.在使用的操作中配置(在select标签中配置)

 

2.2.二级缓存—注解


配置步骤:
1.在mybatis的sqlMapConfig.xml 中配置
2.在接口的定义上面直接使用@CacheNamespace 并将blocking设置为true,二级缓存就可以使用了

 

二级缓存:

  1. Mybatis 的二级缓存相对于一级缓存来说,实现了缓存数据的共享,可控性也更强;
  2. 极大可能会出现错误数据,有设计上的缺陷,安全使用的条件比较苛刻;
  3. 分布式环境下,必然会出现读取到错误数据,所以不推荐使用。

区别小结:

        一级缓存 Mybatis的一级缓存是指SQLSession,一级缓存的作用域是SQlSession, Mabits默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。 每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。 

        二级缓存 二级缓存是mapper级别的,Mybatis默认是没有开启二级缓存的。 第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放代该mapper对应的二级缓存区域。 第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值