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();不会将二级缓存清空,是专门来清理一级缓存的)

浙公网安备 33010602011771号