MyBatis一级缓存和二级缓存

    xiaoxiao2023-10-12  159

    简述

    mybatis提供了缓存机制减轻数据库压力,提高数据库性能。

    mybatis的缓存分为两级:一级缓存、二级缓存。

    一级缓存

    一级缓存是在SqlSession上的缓存,默认情况下,MyBatis系统会开启一级缓存,也就是对于SqlSession层面的缓存,这个缓存不需要POJO对象可序列化。 测试一级缓存:

    @Test public void testFindUser() throws IOException { //读取核心配置文件 String file = "sqlMapConfig.xml"; InputStream in = Resources.getResourceAsStream(file); //日志 Logger logger = Logger.getLogger(MybatisFirstTest.class); //创建sqlsessionfactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //创建sqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User u = userMapper.getUser(1L); logger.info("再获取一次POJO...."); User u1 = userMapper.getUser(1L); sqlSession.close(); }

    这段代码对同一对象进行两次获取,但是在日志中显示只有一条SQL语句被执行,原因是使用了同一个SqlSession对象获取数据,当一个SqlSession第一次通过SQL和参数获取对象后会将其缓存起来,如果下一次SQL和参数没有发生变化,并且缓存没有超时或者需要刷新时,它就会从缓存中直接取数据。

    二级缓存

    二级缓存是在SqlSessionFactory上的缓存,默认情况下,MyBatis系统不会开启二级缓存,需要手动开启,开启二级缓存只需要在映射文件上添加代码:

    <cache/>

    这个时候MyBatis会序列化和反序列化对应的POJO对象,也就要求POJO需要实现序列化接口。如果实体类没有实现序列化接口,MyBatis会抛出异常。

    public class User implements Serializable{ public static final long serialVersionUID = 598736524547906734L; ......................... }

    这个时候从日志上就可以看到不同的SqlSession在获取同一条记录时,都是只发送过一次SQL获取数据,MyBatis将其保存在SqlSessionFactory层面,提供给各个SqlSession使用。

    最新回复(0)