MyBatis中二级缓存和其失效的一种情况

MyBatis的二级缓存(实现需要4个条件)
* MyBatis的一级缓存是SqlSessionFactory级别的,
* 即通过同一个SqlSessionFactory所获取的SqlSession对象
* 查询的数据会被缓存,在通过同一个SqlSessionFactory所获取的SqlSession
* 来查询相同的数据时,会从缓存中获取
* MyBatis开启的条件:
* 1>在核心配置文件中,设置全局配置属性cacheEnabled="true",默认为true,不需要设置

 开启二级缓存 默认值就为true 不需要手动开启
<setting name="cacheEnabled" value="true"/>


* 2>在映射文件中设置标签<cache/>

<cache/>  


* 3>二级缓存必须在SqlSession关闭或提交之后有效

sqlSession.close();


* 4>查询的数据所转换的实体类类型必须实现序列化的接口

implements Serializable 

 

例子
    @Test
    public void testCache() throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        CacheMapper mapper = sqlSession.getMapper(CacheMapper.class);
        Emp emp = mapper.getEmpById(1);
        System.out.println(emp);
        sqlSession.close();
        SqlSession sqlSession1 = sqlSessionFactory.openSession(true);
        CacheMapper mapper1 = sqlSession1.getMapper(CacheMapper.class);
        Emp emp1 = mapper1.getEmpById(1);
        System.out.println(emp1);
        sqlSession1.close();
    }
}

 

* 使二级缓存失效的原因只有一个
* 两次查询中间执行了增删改,会使一级二级缓存同时失效


(sqlSession.clearCache();不会将二级缓存清空,是专门来清理一级缓存的)

posted @   别亦难  阅读(470)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示