1、介绍
MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地
配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实现进行了许多改进。
默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据
进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:
1
当添加上该标签之后,会有如下效果:
映射语句文件中的所有 select 语句的结果将会被缓存。
映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来
清除不需要的缓存。
缓存不会定时进行刷新(也就是说,没有刷新间隔)。
缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以
安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
在进行配置的时候还会分为一级缓存和二级缓存:
一级缓存:线程级别的缓存,是本地缓存,sqlSession级别的缓存。
二级缓存:全局范围的缓存,不止局限于当前会话。
2、一级缓存的使用
一级缓存是sqlsession级别的缓存,默认是存在的。
一级缓存默认是存在的,所以只需要注意一下一级缓存可能会失效的情况就行;
2、二级缓存
二级缓存是全局作用域缓存,默认是不开启的,需要手动进行配置。
Mybatis提供二级缓存的接口以及实现,缓存实现的时候要求实体类实
现Serializable接口,二级缓存在sqlSession关闭或提交之后才会生效。
步骤:
1、全局配置文件中添加如下配置:
当然第一步也可以省略,因为默认会开启二级缓存,将value设置为false就会自动关闭二级缓存
2、需要在使用二级缓存的映射文件出使用标签标注
3、实体类必须要实现Serializable接口
当然二级缓存在实际开发中很少会用到,所以一般会关掉二级缓存,只需要掌握怎么关闭二级缓存的步骤就行
2、缓存的属性
eviction:表示缓存回收策略,默认是LRU
LRU:最近最少使用的,移除最长时间不被使用的对象
FIFO:先进先出,按照对象进入缓存的顺序来移除
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的
对象
WEAK:弱引用,更积极地移除基于垃圾收集器状态和弱引
用规则的对象
flushInternal:刷新间隔,单位毫秒
默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语
句时刷新
size:引用数目,正整数
代表缓存最多可以存储多少个对象,太大容易导致内存溢出
readonly:只读,true/false
true:只读缓存,会给所有调用这返回缓存对象的相同实
例,因此这些对象不能被修改。
false:读写缓存,会返回缓存对象的拷贝(序列化实现),
这种方式比较安全,默认值
缓存的属性注意一下即可;
mybatis一级缓存和二级缓存的区别:
1)一级缓存 Mybatis的一级缓存是指SQLSession,一级缓存的作用域是SQlSession, Mabits默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。
每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。 Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。
2)二级缓存 二级缓存是mapper级别的,Mybatis默认是开启二级缓存的,但是没有实现。 第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放该mapper对应的二级缓存区域。 第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。