美文网首页
一级缓存

一级缓存

作者: 神豪VS勇士赢 | 来源:发表于2018-07-31 16:46 被阅读8次

一级缓存是SqlSession级别的缓存。(默认支持)
缓存的本质:减少查询DB的次数,提升性能。解决高并发的问题。

同样的Session,同样的请求,多次请求:
第一次从DB获取记录后,缓存SqlSession同样有了对应的记录。

图解:


image.png

注意:
sqlSession去执行commit操作(插入、更新、删除),清空一级缓存。
执行更新不提交也会清空一级缓存,但更新记录不进DB。
需要加入日志包和日志属性文件打印SQL

缓存和数据库中的内容需要一致?
SqlSession修改记录,不提交事务,现在SqlSession中的内容和DB中内容是否一致?清空一级缓存的本质,就是为了让缓存和DB的数据一致。再次请求记录的时候从DB找记录,这样缓存和DB一致。

编写测试类 观察以及缓存 :

测试一:
sqlSession 为同一个的时候:

@Test
public void testOneCache(){
SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
BookInfoMapper mapper = sqlSession.getMapper(BookInfoMapper.class);
BookInfo bookInfo = mapper.selectByPrimaryKey(1l);
Log.debug(bookInfo);
BookInfoMapper mapper1 = sqlSession.getMapper(BookInfoMapper.class);
BookInfo bookInfo1 = mapper.selectByPrimaryKey(1l);
Log.debug(bookInfo1);
}
输出结果如下:

image.png

得出结论 :当使用同一个sqlSession 并且第二次查询的信息为第一次查询过的信息 第二次查询是直接从以及缓存中查的数据输出。

测试二:
当我们使用不同的SqlSession 查询 同一条数据信息

@Test
public void testOneChacheDiffSqlSession(){
SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
BookInfoMapper mapper = sqlSession.getMapper(BookInfoMapper.class);
BookInfo bookInfo = mapper.selectByPrimaryKey(1l);
Log.debug(bookInfo);
SqlSession sqlSession1 = SqlSessionFactoryUtilSingleL.getSqlSession();
BookInfoMapper mapper1 = sqlSession1.getMapper(BookInfoMapper.class);
BookInfo bookInfo1 = mapper1.selectByPrimaryKey(1l);
Log.debug(bookInfo1);
}
输出结果如下所示:


image.png

得出结论 :当使用不同的SqlSession查询同一条数据信息的时候 分别从数据库中查询数据信息,不会从一级缓存中 取信息。

测试三:
我们在使用同一个sqlSession 查询数据信息的中间 加入了一个 操作数据库的操作 ,但是并没有commit

@Test
public void testOneCacheAfterCommit(){
SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
BookInfoMapper mapper = sqlSession.getMapper(BookInfoMapper.class);
BookInfo bookInfo = mapper.selectByPrimaryKey(1l);
Log.debug(bookInfo);

    bookInfo.setBookName("java钢贴贴");
    mapper.updateByPrimaryKey(bookInfo);

    BookInfo bookInfo1 = mapper.selectByPrimaryKey(1l);
    Log.debug(bookInfo1);
}

输出结果如下:


image.png

得出结论 :

第一次查询数据信息   在DB 中查询数据 ,接下来 更新数据 ,但是更新数据 并没有提交,

这个时候使用之前查询的sqlSession 这个时候查询出的数据为 一级缓存中的数据。

测试四:

我们先使用 SqlSession查询第一次数据 , 同事使用第一个SqlSession 进行数据更新 ,但是此时并没有提交(commit),这个时候使用第二个 sqlSession 进行查询 , 接下来 使用 第一个sqlSession 进行查询数据信息 。

@Test
public void  testOneCacheAfterCommit(){
    SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
    BookInfoMapper mapper = sqlSession.getMapper(BookInfoMapper.class);
    BookInfo bookInfo = mapper.selectByPrimaryKey(1l);
    Log.debug(bookInfo);

    bookInfo.setBookName("java钢贴贴");
    mapper.updateByPrimaryKey(bookInfo);
    SqlSession sqlSession1 = SqlSessionFactoryUtilSingleL.getSqlSession();
    BookInfoMapper mapper1 = sqlSession1.getMapper(BookInfoMapper.class);
    BookInfo bookInfo1 = mapper1.selectByPrimaryKey(1l);
    Log.debug(bookInfo1);
    BookInfo bookInfo2 = mapper.selectByPrimaryKey(1l);
    Log.debug(bookInfo2);
}

输出结果如下所示:


image.png

得出结论 :
第一个的sqlSession 更改数据 ,但是并没有修改数据 , 所以第二个sqlSession 查询数据的时候
重新查询DB ,这时候 输出结果还是 第一次的查询数据 , 再次使用第一个sqlSession 查询数据的时候,
查询的是 第一个 sqlSession的一级缓存。

测试五 :
仅仅修改一行代码 ,使用第一个 sqlSession 更新数据 ,之后提交(commit ) 其他代码一模一样。

@Test
public void testOneCacheAfterCommit(){
SqlSession sqlSession = SqlSessionFactoryUtilSingleL.getSqlSession();
BookInfoMapper mapper = sqlSession.getMapper(BookInfoMapper.class);
BookInfo bookInfo = mapper.selectByPrimaryKey(1l);
Log.debug(bookInfo);
bookInfo.setBookName("java钢贴贴");
mapper.updateByPrimaryKey(bookInfo);
sqlSession.commit();
SqlSession sqlSession1 = SqlSessionFactoryUtilSingleL.getSqlSession();
BookInfoMapper mapper1 = sqlSession1.getMapper(BookInfoMapper.class);
BookInfo bookInfo1 = mapper1.selectByPrimaryKey(1l);
Log.debug(bookInfo1);
BookInfo bookInfo2 = mapper.selectByPrimaryKey(1l);
Log.debug(bookInfo2);
}

输出结果如下所示:


image.png

得出结果:
第一个sqlSession更新数据,并且提交(commit) ,第二个sqlSession 查询出来的数据是根据DB 查询 , 第一个sqlSession 再次查询数据信息的时候,是从新从DB 查询信息 ,而不是从以及缓存中查询,因为一级缓存 因为 (commit)之后 数据库被修改 所以一级缓存信息被删除 ,再次访问的时候 从DB 查询并输出 。

相关文章

  • 你真的懂Mybatis缓存机制吗

    MyBatis自带的缓存有一级缓存和二级缓存。 一级缓存 Mybatis的一级缓存是指Session缓存。一级缓存...

  • mybatis一级缓存和二级缓存

    MyBatis官网MyBatis拥有自带一级缓存和二级缓存 一级缓存: MyBatis是默认开启一级缓存,一级缓存...

  • [java]38、MyBatis缓存

    1、缓存 MyBatis的缓存分为一级缓存、二级缓存,用于缓存select的结果 1.1、一级缓存 一级缓存是存放...

  • java基础面试题总结——其他大型框架

    1. 简述mybatis缓存机制的实现原理 mybatis缓存分为一级缓存和二级缓存: 一级缓存 概念:一级缓存即...

  • MyBatis缓存书目录

    MyBatis缓存 MyBatis介绍 MyBatis一级缓存 1、什么是一级缓存? 为什么使用一级缓存? 2、M...

  • MyBatis(4)一级缓存,二级缓存

    MyBatis的缓存,包括一级缓存,二级缓存。 什么是一级缓存? 一级缓存指的就是sqlsession,在sqls...

  • Mybatis缓存机制:一级缓存与二级缓存

    MyBatis的缓存分为一级缓存(本地缓存)和二级缓存 1、一级缓存 MyBatis的一级缓存是默认会开启的并且不...

  • Mybatis缓存

    mybatis分为一级缓存和二级缓存,在默认的情况下,Mybatis只会开启一级缓存 一级缓存 一级缓存是一次会话...

  • 一级缓存体验

    1. 测试一级缓存 2. 测试结果 一级缓存也称本地缓存,sqlSession级别的缓存,一级缓存是一直开...

  • Hibernate之缓存

    一、一级缓存 1、在session上面有一个一级缓存,一级缓存的生命周期和session相同,一级缓存最大生命周期...

网友评论

      本文标题:一级缓存

      本文链接:https://www.haomeiwen.com/subject/swgcvftx.html