清空二级缓存问题

清空二级缓存问题

1、在课程第2个例子中,17分30秒,2次会话通过二级缓存获取数据,没有问题,

2、但是,如果在第1次会话的查询后面增加一句commit()方法,再次执行,发现并没有清空二级缓存,两次会话的查询仍然共用一个hashCode

所以commit()方法是只清空一级缓存,还是一级二级缓存都清空?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,commit() 方法的行为是提交当前事务中的所有更改到数据库,并清空一级缓存(Session 缓存),所以不会清除二级缓存。二级缓存的设计目的是跨多个会话(Session)共享缓存数据,以提高查询性能。因此,即使调用了 commit() 方法,也不会影响到其他会话中可能已经缓存的查询结果。

祝学习愉快!

  • 坨坨儿 提问者 #1

    步骤:

    1、mybatis-config.xml关闭一级缓存

    <setting name="localCacheScope" value="STATEMENT"/>

    2、goods.xml开启二级缓存

    <cache eviction="LRU" flushInterval="600000" size="512" readOnly="true"/>

    3、执行测试

        @Test
        public void testLv2Cache(){
            SqlSession sqlSession=null;
            System.out.println("---------------------------------------------------------------");
            try {
                sqlSession = MyBatisUtils.openSession();
    //            sqlSession.getConfiguration().getCaches().forEach(cache -> {
    //                if (cache != null) {
    //                    cache.clear();
    //                }
    //            });
                Goods goods = sqlSession.selectOne("goods.selectById", 2648);
                Goods goods1 = sqlSession.selectOne("goods.selectById", 2648);
                System.out.println(goods.hashCode()+":"+ goods);
                System.out.println(goods1.hashCode()+":"+goods1);
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                MyBatisUtils.closeSession(sqlSession);
            }
            sqlSession=null;
            System.out.println("---------------------------------------------------------------");
            try {
                sqlSession = MyBatisUtils.openSession();
                Goods goods = sqlSession.selectOne("goods.selectById", 2648);
                Goods goods1 = sqlSession.selectOne("goods.selectById", 2648);
                System.out.println(goods.hashCode()+":"+ goods);
                System.out.println(goods1.hashCode()+":"+goods1);
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                MyBatisUtils.closeSession(sqlSession);
            }
            sqlSession=null;
            System.out.println("---------------------------------------------------------------");
            try {
                sqlSession = MyBatisUtils.openSession();
                Goods goods = sqlSession.selectOne("goods.selectById", 2648);
                Goods goods1 = sqlSession.selectOne("goods.selectById", 2648);
                System.out.println(goods.hashCode()+":"+ goods);
                System.out.println(goods1.hashCode()+":"+goods1);
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                MyBatisUtils.closeSession(sqlSession);
            }
        }

    4、结果很奇怪

    输出6条HashCode,除了第1条,后面5条HashCode是一样的,怎么解释?


    2024-04-18 12:10:06
  • 好帮手慕小尤 回复 提问者 坨坨儿 #2

    同学你好,测试同学提供的代码并没有发现hashcode值不一致的情况,如下所示:

    https://img1.sycdn.imooc.com/climg/6620b8dc09f6f41005660530.jpg

    祝学习愉快!

    2024-04-18 14:09:03
  • 坨坨儿 提问者 回复 好帮手慕小尤 #3

    步骤:

    1、mybatis-config.xml关闭一级缓存

    <setting name="localCacheScope" value="STATEMENT"/>

    2、goods.xml开启二级缓存

    <cache eviction="LRU" flushInterval="600000" size="512" readOnly="true"/>

    您确定照做了吗?

    2024-04-18 14:26:22
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java工程师 2024版
  • 参与学习       2020    人
  • 提交作业       1249    份
  • 解答问题       1202    个

2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师