mybatis的缓存问题

1) 一级缓存
   每个sqlsession都有一个一级缓存,只要sql语句和参数相同,只有第一次查询数据库,并且会把查询结果放入一级缓存之后的查询,就直接从一级缓存中获取结果。
   
   一级缓存的作用范围,只限于一个sqlsession

    @Test
    public void test2() {
        SqlSession s1 = factory.openSession();
        s1.selectOne("com.westos.mapper.ProductMapper.select1", 1);
        System.out.println("======================");
        s1.selectOne("com.westos.mapper.ProductMapper.select1", 1);
        s1.close();
    }

   
2) 二级缓存
所有sqlSession共享的缓存,一级缓存无需配置,而二级缓存需要配置,二级缓存的意义是减少与数据库的交互,从而提升程序的性能(SqlMapConfig.xml修改)

<settingname='cacheEnabled'value='true'/>

    <settings>

       <!-- 开启二级缓存 默认值为true -->

    <settingname='cacheEnabled'value='true'/>

    </settings>

    @Test
    public void test2() {
        SqlSession s1 = factory.openSession();
        s1.selectOne("com.westos.mapper.ProductMapper.select1", 1); 
        s1.close();
        System.out.println("+++++++++++++++++++++++++++++++++++++");
        SqlSession s2 = factory.openSession();
        s2.selectOne("com.westos.mapper.ProductMapper.select1", 1);
        s2.close();
        System.out.println("+++++++++++++++++++++++++++++++++++++");
        SqlSession s3 = factory.openSession();
        Product product  = new Product();
        product.setId(1);
        product.setName("TCL 55A950C 55英寸32核人工智能 HDR曲面超薄4K电视金属机身(枪色)");
        product.setTablename("abc");
        product.setPrice(2499.00);
        s3.update("com.westos.mapper.ProductMapper.update", product);
        s3.commit();
        s3.close();
        System.out.println("+++++++++++++++++++++++++++++++++++++");
        SqlSession s4 = factory.openSession();
        s4.selectOne("com.westos.mapper.ProductMapper.select1", 1); 
        s4.close();
       
    }

3) 缓存失效
只要是执行了增,删,改的操作,缓存就应该失效,仍然从数据库查询得到最新结果

4) 二级缓存适用场景
当数据的查询远远多于修改时, 才有启用二级缓存的必要


 

猜你喜欢

转载自blog.csdn.net/weixin_42827269/article/details/83415820