Mybatis 一级缓存 菜鸟日记--day06

Mybatis 一级缓存 菜鸟日记–day06

一、缓存概述

针对查询结果进行缓存,能够提高数据库性能,减少对数据库的访问,降低数据库性能消耗。

 这里讲的缓存就是讲查询到的结果放到内存中(只限于一级缓存),当下次需要获取这条数据的时候就可以直接从缓存中获取,而不是再次去访问数据库来查询得到。
##二、一级缓存

1)缓存级别

   一级缓存是sqlSession级别的缓存,也就是说一个sqlSession对象有一个一级缓冲空间,
其他的sqlSession是没有办法获取到这个缓存中数据的。

2)mybatis对一级缓存的支持

    mybatis默认开启一级缓存不需要用户去设置

3)基本规则

举个例子同一个sqlSession下:
    1.第一次查询id=1的用户,查询得到结果并将结果放入一级缓存区域中。
    2.再次查询,查询条件相同 也是id=1 ,不会访问数据库查询而是返回缓冲区中的第一次查询到的数据。
    3.执行了一条增删改操作,并且commit,清空清空。
    4.再次查询id=1的用户信息,缓冲区中找不到对应数据,到数据库查找。

4)原理概述

抛开复杂过程看做:sqlSession类有一个(hashMap)来存储缓存数据:
    根据用户id查询用户,查询条件相同,sql语句相同,传入参数相同 
    上述这些因素(当然还包括好多其他因素)共同组合成一个key
    第一次查询缓存(hashMap)中没有该条记录,访问数据库查询,将查询结果(value)和查询条件(key)添加进HashMap
    第二次访问,如果key相同,直接从hashMap中读取数据返回
    进行修改操作,并commit();HashMap清空

5)Spring代理下的一级缓存

正常使用过程中,Service进行事务的控制那么一个Service中
service{
    事务开始自动创建一个sqlSession
    第一次使用id 查询 id=1;
    第二次使用id 查询 id=1;//从缓存区域中拿到数据
    事务结束自动关闭sqlSession
}
显然可以看出,一个事务内共享一个缓存区域,多个事务间缓存数据不共享。

猜你喜欢

转载自blog.csdn.net/qq_38325853/article/details/85169185