牢记MyBatis的一级、二级缓存和序列化问题
创始人
2025-05-30 01:14:06
0

缓存就是内存中的一个空间,通常用来提高查询效率。MyBatis支持两种缓存技术:一级缓存和二级缓存。其中一级缓存默认开启,二级缓存默认关闭。

一级缓存:

  1. 一级缓存默认开启

  2. 是一种基于SqlSession的缓存,同一个SqlSession有效,不同的SqlSession无效

  3. 同一个id,可以走缓存;不同id,即使查询的内容相同,也不会走缓存示例代码如下:

  • 示例代码如下:

    //加载核心配置文件
    InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
    //基于构建者创建工厂对象
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    //通过工厂创建sqlSession对象:测试一级缓存
    //第一次查询
    SqlSession sqlSession1 = factory.openSession();
    List list1 = sqlSession1.selectList("selAll1");
    System.out.println(list1);
    System.out.println("*************************");
    //第二次查询
    List list2 = sqlSession1.selectList("selAll1");
    System.out.println(list2);
    sqlSession1.close();
    

       mybatis一级缓存
  1. //加载核心配置文件
    InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
    //基于构建者创建工厂对象
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    //通过工厂创建sqlSession对象:测试一级缓存
    SqlSession sqlSession1 = factory.openSession();
    List list1 = sqlSession1.selectList("selAll1");
    System.out.println(list1);
    System.out.println("***********不同id,即使内容相同,也不走缓存**************");
    List list2 = sqlSession1.selectList("selAll2");
    System.out.println(list2);
    sqlSession1.close();
    

  2. mybatis一级缓存
    //加载核心配置文件
    InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
    //基于构建者创建工厂对象
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    //通过工厂创建sqlSession对象:测试一级缓存
    SqlSession sqlSession1 = factory.openSession();
    List list1 = sqlSession1.selectList("selAll1");
    System.out.println(list1);
    //        sqlSession1.close();
    System.out.println("***********不是同一个sqlSession,不会走缓存**************");
    SqlSession sqlSession2 = factory.openSession();
    List list2 = sqlSession2.selectList("selAll1");
    //        System.out.println(list2);
    

    mybatis一级缓存
  • 二级缓存:

  1. 二级缓存默认关闭

  2. 是一种基于SqlSessionFactory的缓存,同一个工厂创建的SqlSession有效,不同工厂则无效

  3. 需要使用时,应在指定的namespace下进行开启

  4. 标签的属性

  • eviction:缓存清除策略,常用的有LRU、FIFO、SOFT、WEAK

  • flushInterval:刷新间隔,需要给定一个毫秒数,表示指定时间间隔时,会自动刷新缓存

  • size:设置大小,默认是1024

  • readOnly:是否只读(不写入文件),默认是false,需要实体类实现序列化接口

  • type:用于自定义缓存机制,提供一个自定义类的全限定路径,自定义类需要实现CaChe接口

  • type:用于自定义缓存机制,提供一个自定义类的全限定路径,自定义类需要实现CaChe接口

//加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
//基于构建者创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//通过工厂创建sqlSession对象:测试二级缓存
SqlSession sqlSession1 = factory.openSession();List list1 = sqlSession1.selectList("selAll1");
System.out.println(list1);
sqlSession1.close();System.out.println("***********同一个工厂的sqlSession,会走缓存**************");
SqlSession sqlSession2 = factory.openSession();
List list2 = sqlSession2.selectList("selAll1");
System.out.println(list2);

二级缓存

cache hit ratio中文意思是缓存命中率

这是一个计算机术语,终端用户访问加速节点时,如果该节点有缓存住了要被访问的数据时就叫做命中,如果没有的话需要回原服务器取,就是没有命中。

序列化问题:

//加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
//基于构建者创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//通过工厂创建sqlSession对象:测试二级缓存
SqlSession sqlSession1 = factory.openSession();List list1 = sqlSession1.selectList("selAll1");
System.out.println(list1);
sqlSession1.close();

序列化问题

原因分析:User实现类未实现序列化。

为什么要实现序列化:(1)缓存机制:将查询结果保存到内存中 (2)内存饱满,需要移出时,MyBatis就会自动将内存中的内容进行移除,但是文件很重要,不能删除,此时就需要进行序列化,以文件的形式将内容从内存保存到硬盘上,一个内容保存成文件的读写,必须实现序列化。

解决方案:

一:User实体类实现序列化

序列化

二:在标签中添加readOnly属性

表示:要求Mybatis对缓存内容只读不写,当需要移除的时候,直接删除,不需要进行转存。

相关内容

热门资讯

中视传媒跌2.06%,成交额5... 6月10日,中视传媒盘中下跌2.06%,截至13:31,报16.18元/股,成交5192.52万元,...
欧莱雅收购功效护肤品牌Medi... 转自:北京商报北京商报讯(记者 张君花)6月10日,北京商报记者获悉,欧莱雅集团宣布已与英国专业护肤...
种业板块走强 神农种业涨幅居前   06月10日消息,截止13:35,种业板块走强,神农种业、荃银高科、丰乐种业等个股涨幅居前。
焦点科技跌2.03%,成交额1... 6月10日,焦点科技盘中下跌2.03%,截至13:29,报41.58元/股,成交1.40亿元,换手率...
泰山景区通告:年卡暂停销售 转自:大众新闻-大众日报6月10日,泰山景区管委会发布关于票务系统升级暂停年卡销售的通告,自2025...
苏大维格跌2.02%,成交额8... 6月10日,苏大维格(维权)盘中下跌2.02%,截至13:22,报20.40元/股,成交8937.1...
亚邦股份跌2.10%,成交额5... 6月10日,亚邦股份盘中下跌2.10%,截至13:29,报4.20元/股,成交5884.88万元,换...
泉果嘉源三年持有期混合A(01... 截至2025年6月9日,泉果嘉源三年持有期混合A(019624)近一年回报达9.43%。从基金规模来...
通用电梯跌2.08%,成交额2... 6月10日,通用电梯盘中下跌2.08%,截至13:20,报7.05元/股,成交2166.45万元,换...
中化国际跌2.05%,成交额5... 6月10日,中化国际盘中下跌2.05%,截至13:23,报3.83元/股,成交5540.39万元,换...
龙头股份跌2.00%,成交额5... 6月10日,龙头股份盘中下跌2.00%,截至13:29,报8.33元/股,成交5884.88万元,换...
振华重工跌2.02%,成交额1... 6月10日,振华重工盘中下跌2.02%,截至13:28,报4.36元/股,成交1.69亿元,换手率1...
安阳钢铁跌2.07%,成交额2... 6月10日,安阳钢铁盘中下跌2.07%,截至13:21,报1.89元/股,成交2356.58万元,换...
远东股份跌2.17%,成交额1... 6月10日,远东股份盘中下跌2.17%,截至13:21,报4.95元/股,成交1.75亿元,换手率1...
冠中生态跌2.00%,成交额1... 6月10日,冠中生态盘中下跌2.00%,截至13:29,报10.29元/股,成交1592.45万元,...
盛路通信跌2.03%,成交额1... 6月10日,盛路通信盘中下跌2.03%,截至13:21,报6.77元/股,成交1.50亿元,换手率2...
际华集团跌2.17%,成交额6... 6月10日,际华集团盘中下跌2.17%,截至13:21,报2.70元/股,成交6146.84万元,换...
利安科技跌2.02%,成交额3... 6月10日,利安科技盘中下跌2.02%,截至13:18,报51.46元/股,成交3371.08万元,...
安道麦A跌2.07%,成交额3... 6月10日,安道麦A盘中下跌2.07%,截至13:26,报7.11元/股,成交3763.81万元,换...
新华百货跌2.12%,成交额4... 6月10日,新华百货盘中下跌2.12%,截至13:30,报11.98元/股,成交4935.98万元,...