重要概念

  • SqlSession:代表和数据库的一次会话,提供了操作数据库的方法。

  • MappedStatement:代表要发往数据执行的命令,可以理解为SQL的抽象表示。

  • Executor:和数据库交互的执行器,接收MappedStatement。

  • 映射接口:在接口中会要执行的SQL用一个方法表示,具体SQL写在映射文件中。

  • 映射文件:编写SQL的文件。

一级缓存介绍

在代码运行时,有可能会在一个数据库会话中执行多次相同的SQL,这种反复的查询会带来开销。

每一个SqlSession都持有自己的缓存,就是LocalCache。一种是Session级别的,在Mybatis中执行的所有语句都会共享这一个缓存。一种是Statement级别的,缓存只对当前statement语句。

当发起查询时,Mybatis会根据statementId、params、rowBounds生成一个key,去Cache查,如果没有的话会去数据库查,并且缓存到本地。

一级缓存的不足

使用一级缓存的时候,因为缓存不能跨会话共享,不同的会话之间对于相同的数据可能有不一样的缓存。在有多个会话或者分布式环境下,会存在脏数据的问题。如果要解决这个问题,就要用到二级缓存。MyBatis 一级缓存无法关闭,但是有两种级别可选:

  1. session级别的缓存,在同一个sqlSession内,对同样的查询将不再查询数据库,直接从缓存中取。

  2. statement级别的缓存,为了避免上述问题,可以将一级缓存的级别设为 statement 级别的,这样每次查询结束都会清掉一级缓存。

二级缓存

二级缓存是用来解决一级缓存不能跨会话共享的问题的,在XML文件配置后可以被多个SqlSession共享,生命周期和应用同步。

如果MyBatis使用了二级缓存,并且Mapper和select语句也配置使用了二级缓存,那么在执行select查询的时候,MyBatis会先从二级缓存中取输入,其次才是一级缓存。

即MyBatis查询数据的顺序是:二级缓存 —> 一级缓存 —> 数据库。

https://www.cnblogs.com/wuzhenzhao/p/11103043.html

一、二级缓存的使用注意点

  • MyBatis默认的session级别一级缓存,由于Spring Boat 中默认使用了hikariCP,所以基本没用,需要开启事务才有用。但一级缓存作用域仅限同一sqlSession内,无法感知到其他sqlSession的增删改,所以极易产生脏数据。

  • 二级缓存可通过cache-ref让多个mapper.xml共享同一namespace,从而实现缓存共享,但多表联查时配置略微繁琐。

  • 生产环境建议将一级缓存设置为statment级别(即关闭一级缓存),如果有必要,可以开启二级缓存。

  • 在分布式环境中也是不建议开启二级缓存的,因为缓存是保存到本地的,这样也会导致产生脏数据。

最新文章

  1. <nginx.conf> nginx用户权限
  2. SQL Server优化器特性-动态检索
  3. 3 TKinter设置宽高及背景色
  4. Dynamices CRM Permission Issue (Security role UI to privilege mapping)'s solution
  5. struts中调用servlet的两种方法——IcC方式和非IoC方式的代码demo
  6. 不安装oracle客户端,连接到服务器的oracle (注:针对 odp.net)
  7. 文成小盆友python-num9 socket编程
  8. PLSQL 几种游标的用法
  9. iOS推送,看这篇足够了
  10. SQLServer存储过程批量删除
  11. centos7系统优化定制
  12. jsonp 简单封装
  13. JSON Support in PostgreSQL and Entity Framework
  14. Compiler showing 'pi' symbol on error
  15. Activiti启动某个流程失败,页面报500
  16. 睡前小dp-poj2096-概率dp
  17. Java编程的逻辑 (85) - 注解
  18. cocos2d-x JS 纯代码加载播放plist与png动画
  19. VS无法导航到插入点F12失败
  20. jQuery 遮盖层弹出后禁止页面滚动

热门文章

  1. C# 排序列表(SortedList)
  2. spring boot集成pagehelper(两种方式)
  3. Difference between trustStore and keyStore in Java - SSL
  4. ScheduledExecutorService中scheduleAtFixedRate方法与scheduleWithFixedDelay方法的区别
  5. MySQL binlog 自动清理脚本
  6. Centos7.4 安装MySQL 5.7.21 (通用二进制包)
  7. Linux新加磁盘并挂载到目录
  8. Docker(42)- 镜像原理之联合文件系统
  9. SQLSERVER存储过程基础
  10. 通过Kubernetes监控探索应用架构,发现预期外的流量