前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatis框架一级和二级缓存

mybatis框架一级和二级缓存

作者头像
多凡
发布2019-11-01 09:19:18
4460
发布2019-11-01 09:19:18
举报
文章被收录于专栏:sringbootsringboot

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_44580977/article/details/96620890

1.为什么要有缓存?

因为有些时候查询数据的频率很高,很耗费数据库资源,所有常常把变动不大且访问率高的数据放在一个缓存容器里,从而缓解数据库压力。

2.一级缓存

  1. 存在时间 SqlSession类实例对象存在时,一级缓存一直存在,在这期间除非了修改,添加,删除,执行commit,close,flush ,clearCache时,缓存才会被清空。 当查询数据时,会先到一级缓存查询,如果没有相关数据,会到数据库查询,然后保存到一级缓存。
  2. 一级缓存开启配置 一级缓存是mybatis默认开启的 如果要关闭,在crud标签体内增加 usrCache=“true/false”

3.二级缓存

  1. 存在时间 二级缓存是多个SqlSession共享一个mapper缓存空间,其他清空的情况和一级缓存相同,二级缓存只不过是比一级缓存范围大了而已(这里的二级缓存解释是书上的, 《spring mvc+mybatis 开发》p106上面的解释,但我测试的时候有疑问在最后)
  2. 二级缓存开启配置
代码语言:javascript
复制
	SqlMapConfig.xml配置
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
代码语言:javascript
复制
	mapper.xml
<!--开启user支持二级缓存-->
    <cache/>

嗯,在二级缓存测试过程中, 我已经照着上面把二级缓存开启了, 可是没有达到从缓存中取出数据 而是两次查询了数据库

代码语言:javascript
复制
	测试类
public class SecondLevelCacheTest {

    private InputStream in;
    private  SqlSessionFactory factory;

    @Before//用于在测试方法执行之前执行
    public void init()throws Exception{
        //1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory
        factory = new SqlSessionFactoryBuilder().build(in);

    }

    @After//用于在测试方法执行之后执行
    public void destroy()throws Exception{
        in.close();
    }

    /**
     * 测试一级缓存
     */
    @Test
    public void testSecondLevelCache(){
        SqlSession sqlSession1 = factory.openSession();


        IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);
        User user1 = dao1.findById(41);
        System.out.println(user1);

		//同一个工厂实例创建的不同sqlsession实例
        SqlSession sqlSession2 = factory.openSession();
        
        IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);
        User user2 = dao2.findById(41);
        System.out.println(user2);
        sqlSession2.close();

        System.out.println(user1 == user2);
        //输出false,user1和user2不是同一个对象
    }
}

多个sqlsession实例 共享一个mapper 不是嘛?为什么 这里输出的user 不是同一个对象? 有点以为,如果有朋友看见搞明白了,愿告评论告知一下

代码语言:javascript
复制
四处跪求原因终于找到,二级缓存只有当,关闭sqlsession的时候才会存入二级缓存空间
测试代码修改如下,可以更加深入了解二级缓存
代码语言:javascript
复制
	//进修改这里
    @Test
    public void testSecondLevelCache(){
        SqlSession sqlSession1 = factory.openSession();

        SqlSession sqlSession2 = factory.openSession();
        IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);
        User user2 = dao2.findById(41);
        System.out.println(user2);
        sqlSession2.close();


        IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);
        User user1 = dao1.findById(41);
        System.out.println(user1);


        System.out.println(user1 == user2);
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.为什么要有缓存?
  • 2.一级缓存
  • 3.二级缓存
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档