Mybatis的一级二级缓存
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的时候,首先它会在自己的一级缓存里面找,如果找不到,那就去二级缓存里面找
找到了就不用去查询数据库,从而减少了数据库的压力,提高了查询速度。
这个二级缓存清空也和一级缓存一样,如果有操作数据库,那么会清空缓存的,防止数据不一致。 以上。
最新文章
- poj1573 Robot Motion
- 初学UML——用例图
- Python ~~~ 面向对象的利器
- nodejs redis
- iOS 基础 第三天(0808)
- Hadoop: the definitive guide 第三版 拾遗 第十二章 之Hive初步
- 【面向对象设计原则】之单一职责原则(SRP)
- C#实现WinForm禁止最大化、最小化、双击标题栏、双击图标等操作的方法
- Javascript合并表格相同内容单元格示例
- scrapy常用命令
- Match 3 小项目学习
- Atlas:ERROR 1105 (HY000): #07000Proxy Warning - IP Forbidden
- 自己开发Visual studio插件-一个nvelocity高亮插件
- Java与编码问题串讲之二–如何理解java采用Unicode编码
- windows svn 客户端连不上linux svn server
- Java中String的替换函数:replace与replaceAll的区别
- python并发编程之Queue线程、进程、协程通信(五)
- ref:使用Dezender对zend加密后的php文件进行解密
- JoinableQueue
- fabric生产环境代码包发布管理
热门文章
- Swift4 基本数据类型(范围型, Stride型, 数组, 字符串, 哈希表)
- C++默认函数与函数重载
- 背包DP HDOJ 5410 CRB and His Birthday
- Kali linux 2016.2(Rolling)里安装中文输入法
- Spring注解驱动开发之AOP
- 【Hibernate】Access to DialectResolutionInfo cannot be null when &#39;hibernate.dialect&#39; not set
- MVC中使用MVCPager简单分页
- OpenGl之旅-—如何使用code blocks创建一个opengl项目
- ubuntu下pycharm无法使用pip安装python包的修复方案
- python文件的读写的模式