mybatis 缓存

十一、缓存

1.一级缓存

SqlSession sqlSession = MybatisUnit.getSqlSession ();
        BlogMapper mapper = sqlSession.getMapper (BlogMapper.class);
        Map<String, Object> map = new HashMap<> ();
        map.put ("author","queen");
        Blog blog = mapper.getBlog (map);
        System.out.println (blog);
        System.out.println ("****************************");
        map.put ("author","queen");
        Blog blog1 = mapper.getBlog (map);
        System.out.println (blog1);
        sqlSession.commit ();
        sqlSession.close ();

一级缓存是在sqlsession层面上的,在sqlsession产生到关闭之间的涉及增删改查的数据都会被保存下来

效果:

==>  Preparing: select * from mybatis.blog where author=?
==> Parameters: queen(String)
<==    Columns: id, title, author, create_time, views
<==        Row: 566993470e944aa2ba4003c7ccbfaf5d, 我是最帅的, queen, 2020-08-09 10:23:10, 10
<==      Total: 1
Blog{author='queen', createTime=null, id='566993470e944aa2ba4003c7ccbfaf5d', title='我是最帅的', views=10}
****************************
Blog{author='queen', createTime=null, id='566993470e944aa2ba4003c7ccbfaf5d', title='我是最帅的', views=10}

由于存在缓存,我们的第二次查询就没有执行查询语句,而是直接从缓存中取出来;

可以利用sqlSession.clearCache()来清除缓存;清除以后的话,就会在加载一次数据库;

缓存消失的原因:

  • 自己清除,利用函数
  • 查询语句会被我们的增删改语句覆盖,目的就是我们的增删改已经修改了数据,再次访问缓存里面的就会导致取出的数据不真实;
  • 查询的是不同的mapper.xml下面的东西
  • 查询不同的东西,比如查询一号和二号

2.二级缓存

当你使用二级缓存的时候,只有一级缓存会话消失后才会缓存到二级缓存;

@org.junit.Test
    public void test2 () {
        SqlSession sqlSession = MybatisUnit.getSqlSession ();
        SqlSession sqlSession2 = MybatisUnit.getSqlSession ();
        BlogMapper mapper = sqlSession.getMapper (BlogMapper.class);
        Map<String, Object> map = new HashMap<> ();
        map.put ("author","Queen and King");
        Blog blog = mapper.getBlog (map);
        System.out.println (blog);
        sqlSession.close ();//会话关闭,一级缓存变成二级缓存

        System.out.println ("++++++++++++++++++++++++++++++++++++++++++++++++");

        BlogMapper mapper2 = sqlSession2.getMapper (BlogMapper.class);
        Map<String, Object> map2 = new HashMap<> ();
        map2.put ("author","Queen and King");
        Blog blog2 = mapper2.getBlog (map);
        System.out.println (blog2);
        sqlSession2.close ();
    }

第二次由于缓存的原因,他没有在访问数据库,而是直接从缓存中拿;
使用cache就只需要一个标签就可以了

注意:

  • 缓存的时候,实体类要序列化,所以我们的实体类要继承序列化接口,这个也是一个标准;
  • 二级缓存的作用域就是namespace,一个mpper.xml,所有数据都放在先放在一级缓存,只有当我们关闭会话,这个才回到二级缓存;

关于mysql的服务器缓存:
当你执行查询语句的时候,服务器会先在一个叫查询缓存中找你要查询的数据,如果有,直接取出来,没有的话,再去数据库查询,在对语言进行解析和查询,减少服务器的压力;
mysql服务器逻辑架构图

自学总结
学习地址:狂神说Java

posted @ 2020-08-15 16:15  SaxonMo  阅读(106)  评论(0编辑  收藏  举报