数据库

Mybatis 两级缓存机制

2020-06-17  本文已影响0人  0小水瓶0

转载:https://www.jianshu.com/p/d98d6cb61841

Mybatis框架提供了查询缓存机制,缓存的好处就是不是每次查询都要去数据库中获取数据,这样就减轻数据库压力,提高系统性能。

一、Mybatis缓存的介绍

Mybatis的缓存机制一共分为两级,一般我们将其称之为一级缓存二级缓存

雷丰阳老师图解缓存机制

二、缓存具体实现

1、一级缓存

一级缓存失效情况(没有使用到当前一级缓存的情况,效果就是,还需要再向数据库发出查询)

  • sqlSession不同。
  • sqlSession相同,查询条件不同.(当前一级缓存中还没有这个数据)
  • sqlSession相同,两次查询之间执行了增删改操作(这次增删改可能对当前数据有影响)
  • sqlSession相同,手动清除了一级缓存(缓存清空)

案例:从员工表里面查询单个的员工信息

 @Test
    public void test04() throws IOException {
        System.out.println("Test04");
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try{
            EmployeeMapper mapper01 = sqlSession.getMapper(EmployeeMapper.class);
            Employee emp1 = mapper01.getEmpsById(1);
            System.out.println(emp1);
            //1.sqlSession不同
            // SqlSession sqlSession1 = sqlSessionFactory.openSession();
            // EmployeeMapper mapper02 = sqlSession1.getMapper(EmployeeMapper.class);
            //2.sqlSession相同,但是的两次查询条件不一样(当前一级缓存中还没有这个数据)Employee emp2 = mapper01.getEmpsById(3);
            //3.sqlSession相同,但是两次查询之间进行了增删改操作(这次增删改可能对当前数据有影响)
            //mapper01.addEmpsById(new Employee(null,"BB","1","BB@gmail.com"));
            //4、sqlSession相同,但是手动清楚了一级缓存(缓存清空)
            sqlSession.clearCache();
            Employee emp2 = mapper01.getEmpsById(3);
            System.out.println(emp2);
            System.out.println(emp1==emp2);
        }finally {
        }
        try {
        }finally {
            sqlSession.close();
        }
    }
2、二级缓存

1、二级缓存是基于namespace级别的缓存,一个namespace对应一个二级缓存。
2、工作机制

3、和缓存有关的设置/属性:
和缓存有关的设置/属性:
1)cacheEnabled=true:false:关闭缓存(二级缓存关闭)(一级缓存一直可用的)
2)每个select标签都有useCache="true":
        false:不使用缓存(一级缓存依然使用,二级缓存不使用)
3)【每个增删改标签的:flushCache="true":(一级二级都会清除)】
        增删改执行完成后就会清楚缓存;
        测试:flushCache="true":一级缓存就清空了;二级也会被清除;
        查询标签:flushCache="false":
            如果flushCache=true;每次查询之后都会清空缓存;缓存是没有被使用的;
4)sqlSession.clearCache();只是清楚当前session的一级缓存;
5)localCacheScope:本地缓存作用域:(一级缓存SESSION);当前会话的所有数据保存在会话缓存中;
     STATEMENT:可以禁用一级缓存;
4、第三方缓存整合:
1)导入第三方缓存包即可;
2)导入与第三方缓存整合的适配包;官方有;
3)mapper.xml中使用自定义缓存
<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

未完待续~~~

上一篇下一篇

猜你喜欢

热点阅读