Mybatis提供了缓存机制,可以减轻数据库的压力,提高性能

Mybatis的缓存分为两级:一个是一级缓存,一个二级缓存

一级缓存:即默认使用的缓存SqlSession级别的缓存,只在sqlsession内有效

二级缓存:mapper级别的缓存,同一个namespace公用一个缓存,所以对sqlsession是共享的

一级缓存:具体流程如下:

      1,第一次执行select的时候,会把查到的数据写入sqlsession里面的hashmap里面缓存起来

      2,然后第二次查询的时候,会从缓存中查数据,如果传入的参数相同,那么就直接从缓存中返回数据,而不去查数据库,因此提高了效率。

      但是要注意:当你去对数据库进行操作(inset,update,delete)的时候,会清空当前sqlsession里面的所有缓存,以此来保证数据库数据与缓存

      数据一致。当你执行cleanCach()这个方法的时候,也会清空缓存。

      顺便提一句,mybatis的缓存是基于【namespace:sql语句:参数】来进行缓存的,sqlsession用hashmap进行缓存的时候,是用

      【namespace:sql语句:参数】作为key,,查询返回的语句作为value保存的。

二级缓存:是mapper级别的缓存,也是就同一个namespace的mapper.xml,多个sqlsession使用同一个mapper操作数据的时候,得到的数据会

     缓存在同一个区域

     这个二级缓存是默认不开启的,因此要去设置一下

     如果不是用springboot,那需要在mybatis-config.xml配置文件里面加入这个设置:

     这个默认是false,所以开启一下 

<settings>
<setting name="cacheEnabled" value="true"/>默认是false:关闭二级缓存
<settings>

     如果是springboot,则不用这个mybatis-config,xml也行

     在application.properties里面加上这一句:

#开启二级缓存
mybatis.configuration.cache-enabled=true

     也可以起到哦同样的作用

      最后也要在mapper.xml文件里面配置一下:

      加入<catch/>标签

<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>当前mapper下所有语句开启二级缓存

   这里简单说一下eviction回收策略:有四个(默认是LRU)

                  1,LRU:用的最少的,长时间不用的去掉

                  2,FIFO:先进先出按进入缓存的顺序去掉

                  3,SOFT:基于垃圾回收状态和软引用规则

                  4,WEAK –  弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

flushInterval:刷新时间,size:容量,readONly:只读(开启)

如此大体流程如下:
        1,当执行一次sqlsession的select的时候,在关闭sqlsession后会把查询结果存到二级缓存里面
        2,当另外一个sqlsession执行select的时候,首先它会在自己的一级缓存里面找,如果找不到,那就去二级缓存里面找
         找到了就不用去查询数据库,从而减少了数据库的压力,提高了查询速度。
    这个二级缓存清空也和一级缓存一样,如果有操作数据库,那么会清空缓存的,防止数据不一致。 以上。

最新文章

  1. poj1573 Robot Motion
  2. 初学UML——用例图
  3. Python ~~~ 面向对象的利器
  4. nodejs redis
  5. iOS 基础 第三天(0808)
  6. Hadoop: the definitive guide 第三版 拾遗 第十二章 之Hive初步
  7. 【面向对象设计原则】之单一职责原则(SRP)
  8. C#实现WinForm禁止最大化、最小化、双击标题栏、双击图标等操作的方法
  9. Javascript合并表格相同内容单元格示例
  10. scrapy常用命令
  11. Match 3 小项目学习
  12. Atlas:ERROR 1105 (HY000): #07000Proxy Warning - IP Forbidden
  13. 自己开发Visual studio插件-一个nvelocity高亮插件
  14. Java与编码问题串讲之二–如何理解java采用Unicode编码
  15. windows svn 客户端连不上linux svn server
  16. Java中String的替换函数:replace与replaceAll的区别
  17. python并发编程之Queue线程、进程、协程通信(五)
  18. ref:使用Dezender对zend加密后的php文件进行解密
  19. JoinableQueue
  20. fabric生产环境代码包发布管理

热门文章

  1. Swift4 基本数据类型(范围型, Stride型, 数组, 字符串, 哈希表)
  2. C++默认函数与函数重载
  3. 背包DP HDOJ 5410 CRB and His Birthday
  4. Kali linux 2016.2(Rolling)里安装中文输入法
  5. Spring注解驱动开发之AOP
  6. 【Hibernate】Access to DialectResolutionInfo cannot be null when &#39;hibernate.dialect&#39; not set
  7. MVC中使用MVCPager简单分页
  8. OpenGl之旅-—如何使用code blocks创建一个opengl项目
  9. ubuntu下pycharm无法使用pip安装python包的修复方案
  10. python文件的读写的模式