温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MyBatis的缓存机制

发布时间:2020-06-16 17:04:48 来源:网络 阅读:402 作者:Adam的blog 栏目:开发技术

前言


MyBatis中允许使用缓存,分为一级缓存和二级缓存,下面看下MyBatis中如何配置缓存。

一级缓存和二级缓存


ps:下面代码省略主配置文件和sql映射文件,直接给出测试方法。

public class MyBatisTest {

    // 获取SqlSessionFactory对象
    private SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        return new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 两级缓存:
     *  一级缓存:(本地缓存), 在SqlSession上的缓存, 一级缓存一直开启;sqlSession级别的一个Map
     *      1. 与数据库同一次会话期间查询到的数据会放在本地缓存中,以后如果需要获取相同的数据,没有必要在查询数据库
     *      
     *      2. 一级缓存失效的情况(没有使用到当前一级缓存的情况,效果就是,还需要再向数据库发出查询)
     *          1. sqlSession不同
     *          2. sqlSession相同,查询条件不同(当前缓存中还没有这个数据)
     *          3. sqlSession相同,两次查询之间执行了增删改操作(这次增删改可能对当前数据有影响)
     *          4. sqlSession相同,手动清除了一级缓存(缓存清空)
     * 
     *  二级缓存:(全局缓存), 在SqlSessionFactory上的缓存,基于namespace级别的缓存,一个namespace对应一个二级缓存
     *      1. 工作机制:
     *          1、一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中;
     *          2、如果会话关闭,一级缓存中的数据会被保存到二级缓存中,新的会话查询信息,就可以参照二级缓存中的内容;
     *          3、不同namespace查出的数据会放在自己对应的map(缓存)中
     *      
     *      2. 使用:
     *          1、开启全局二级缓存设置:
     *          2、去mapper.xml中进行配置
     *          3、我们的POJO需要实现序列化接口
     *      
     *      3. 效果:
     *          数据会从二级缓存中获取;只有会话提交或关闭后,一级缓存中的数据才会转移到二级缓存中
     *          
     * @throws IOException 
     */

    //测试二级缓存
    @Test
    public void testSecondLevelCache() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        SqlSession openSession2 = sqlSessionFactory.openSession();

        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);

            Employee emp01 = mapper.getEmployeeById(3);
            System.out.println(emp01);
            openSession.close();

            //第二次查询是从二级缓存中拿到的数据,并没有发送新的sql
            Employee emp02 = mapper2.getEmployeeById(3);
            System.out.println(emp02);
            System.out.println(emp01 == emp02);
        } finally {
            openSession2.close();
        }
    }

    //测试一级缓存
    @Test
    public void testFirstLevelCache() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();

        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            Employee emp01 = mapper.getEmployeeById(3);
            System.out.println(emp01);

            Employee emp02 = mapper.getEmployeeById(3);
            System.out.println(emp02);
            System.out.println(emp01 == emp02);
        } finally {
            openSession.close();
        }
    }
}

敲重点:二级缓存的配置
 1、 在主配置文件中开启二级缓存总开关
MyBatis的缓存机制
 2、sql映射文件中开启二级缓存
MyBatis的缓存机制
 3、POJO实现序列化接口
MyBatis的缓存机制

缓存的原理


MyBatis的缓存机制

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI