Mybatis一级缓存与二级缓存

2023-12-13 12:32:29

一、简介

????????数据库接收到sql语句后,需要词法/语法解析,优化sql语句,制定执行计划。多数情况下,相同的sql语句可能只是传入参数不同(如where条件后的值不同...)。

????????如果每次都需要经过上面的 词法/语法解析、语句优化、制定执行计划 等,则效率就明显不行了。所以预编译的优势就体现出来了。预编译语句在被MySQL编译器编译后,执行代码会被缓存下来。那么下次调用时,只要是相同的预编译语句就再不需要编译,只要将参数直接传入编译过的语句执行代码中即可。

? ? ? ? 其中我们使用mybatis时,使用#{}注入参数时,mybatis使用的是预编译能够防止sql注入。

一级缓存

一般来说一个请求中的增删改查是同一个sqlSession,每个请求有自己的一级缓存,同一个sqlSession两个查询之间有一个insert、update或delete,会使查询的缓存清空

二级缓存

二级缓存是全局的,多个请求可以公用一个缓存、需要手动开启

  • 缓存会先放到一级缓存中、当sqlSession会话提交或者关闭时才会将一级缓存刷新到二级缓存中;
  • 开启二级缓存后,用户查询时,会先去二级缓存中找,找不到在去一级缓存中找;
  • 另外,缓存还有以下几种情况需要注意
  • 映射语句文件中的所有 select 语句的结果将会被缓存。
  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  • 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  • 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

文章来源:https://blog.csdn.net/m0_46561911/article/details/134867458
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。