MyBatis是一个流行的Java持久化框架,它提供了一个灵活的缓存机制来提高查询性能。
MyBatis的缓存机制主要分为一级缓存和二级缓存。
一级缓存是指在同一个SqlSession中,查询结果会被缓存起来,当再次执行同样的查询时,直接从缓存中获取结果,而不需要再次发起数据库查询。一级缓存是MyBatis默认启用的,可以通过配置来禁用。
二级缓存是指多个SqlSession之间共享的缓存,它可以减少数据库的访问次数,提高性能。默认情况下,二级缓存是禁用的,需要手动配置开启。可以使用一些第三方插件(比如EhCache或Redis)来实现二级缓存。
要启用二级缓存,需要在MyBatis的配置文件中配置相应的缓存配置。在映射文件中,可以使用<cache>标签来配置二级缓存的相关属性,比如缓存类型、缓存过期时间等。
Mybatis默认开启一级缓存,当在同一个会话中多次查询同一个语句,Mybatis会自动使用一级缓存获取查询结果。
@Test
public void test2() throws IOException {
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
System.out.println("第一次查询:");
System.out.println(mapper.selectAll());
System.out.println("第二次查询");
System.out.println(mapper.selectAll());
sqlSession.close();
}
由此可见,第二此次查询是从一级缓存中拿到的结果。
修改语句,将查询语句之间插入一条删除语句
一级缓存会在删除时自动清除,不仅仅是删除,增加,更新也会使一级缓存清除。
不同的会话对象不会共享缓存
@Test
public void test2() throws IOException {
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
SqlSession anthorSqlSession=sqlSessionFactory.openSession();
AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
AccountMapper anthorMapper = anthorSqlSession.getMapper(AccountMapper.class);
System.out.println("第一次查询:");
System.out.println(mapper.selectAll());
System.out.println("第二次查询");
System.out.println(anthorMapper.selectAll());
sqlSession.close();
}
一级缓存仅仅在同一会话中生效
Mybatis中一个SqlSessionFactory对应一个数据库,而二级缓存就是SqlSessionFactory级别的。
开启二级缓存需要一下步骤
<settings>
<setting name="cacheEnable" value="true"/>
</settings>
默认值就是true
实现Serializable接口
public void test2() throws IOException {
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
SqlSession anthorSqlSession=sqlSessionFactory.openSession();
AccountMapper mapper = sqlSession.getMapper(AccountMapper.class);
AccountMapper anthorMapper = anthorSqlSession.getMapper(AccountMapper.class);
System.out.println("第一次查询:");
System.out.println(mapper.selectAll());
sqlSession.commit();
System.out.println("第二次查询");
System.out.println(anthorMapper.selectAll());
sqlSession.close();
}
注意:当出现增加,删除,更新语句的时候,二级缓存通用会被清除
MyBatis的二级缓存提供了多种驱逐策略(Eviction Strategy)来管理缓存中的对象,确保缓存不会无限增长并占用过多的内存。以下是一些常见的驱逐策略:
例如:
<cache eviction="FIFO"></cache>
总结一下,MyBatis的缓存机制包括一级缓存和二级缓存,一级缓存默认启用且无需配置,一级缓存是SqlSession级别的缓存;二级缓存需要手动配置启用,可以减少数据库的访问次数,提高性能,是多个SqlSession共享的缓存。