Mybatis一级缓存与二级缓存

一、简介

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

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

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

一级缓存

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

二级缓存

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值