牢记MyBatis的一级、二级缓存和序列化问题

缓存就是内存中的一个空间,通常用来提高查询效率。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<User> list1 = sqlSession1.selectList("selAll1");
    System.out.println(list1);
    System.out.println("*************************");
    //第二次查询
    List<User> 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<User> list1 = sqlSession1.selectList("selAll1");
    System.out.println(list1);
    System.out.println("***********不同id,即使内容相同,也不走缓存**************");
    List<User> 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<User> list1 = sqlSession1.selectList("selAll1");
    System.out.println(list1);
    //        sqlSession1.close();
    System.out.println("***********不是同一个sqlSession,不会走缓存**************");
    SqlSession sqlSession2 = factory.openSession();
    List<User> list2 = sqlSession2.selectList("selAll1");
    //        System.out.println(list2);
    

    mybatis一级缓存
  • 二级缓存:

  1. 二级缓存默认关闭

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

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

  4. <cache>标签的属性

  • 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<User> list1 = sqlSession1.selectList("selAll1");
System.out.println(list1);
sqlSession1.close();
 
System.out.println("***********同一个工厂的sqlSession,会走缓存**************");
SqlSession sqlSession2 = factory.openSession();
List<User> 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<User> list1 = sqlSession1.selectList("selAll1");
System.out.println(list1);
sqlSession1.close();

序列化问题

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

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

解决方案:

一:User实体类实现序列化

序列化

二:在<cache>标签中添加readOnly属性

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值