首先,不建议使用它,由于很容易出现脏数据,因此去百度一把使用redis或者memCache去实现更高层级的统一缓存,避免出现脏数据。java
从Mybatis 的官方文档就能够看出来很是的简单,估计他们本身都不推荐使用此功能。redis
说说它的用法吧。sql
Mybatis除了一级缓存外,还拥有二级缓存,它是针对一个mapper文件的,被多个SqlSession共享,开启二级缓存后数据查询流程是:二级缓存 -> 一级缓存 -> 数据库数据库
它只有当SqlSession更新完成或者回滚完成后才会更新,且增删改操做不能设置flushCache=true。在实际变成过程当中就意味着必须显示的提交或者回滚或者关闭SqlSession才能触发查询结果被更新到缓存中缓存
开启二级缓存,步骤以下:安全
1.在全局配置文件中的<setting>标签中配置<setting name="cacheEnabled" value="true"/>session
2.在mapper文件中添加<cache>标签,该标签配置后默认具备下面的能力并发
2.1缓存mapper文件中的全部select结果app
2.2增删改会马上刷新一、2级缓存性能
2.3缓存满后清理规则为LRU(a Least Recently Used)
2.4缓存默认大小为1024
2.5缓存无自动刷新
2.6缓存是读写模式
<cache>标签的几个属性:
eviction:缓存清理规则,取值有LRU ,FIFO ,SOFT ,WEAK四种方式 ,默认值为LRU
flushInterval:设置自动刷新时间,默认值为不设置
size:设置缓存能够存放引用的大小,默认值为1024
readOnly:设置缓存是否只读,取值有TRUE和FALSE,默认值为FALSE,若是为TRUE,则全部相同的sql语句返回的是同一个对象(有助于提升性能,但并发操做同一条数据时,可能不安全,但速度更快),若是设置为FALSE,则相同的sql,后面访问的是cache的clone副本
就算开启了二级缓存,你依然能够在<select>中设置useCache="false"来关闭该查询结果被更新到缓存中
举例:
SqlSession session1 = getSqlSession(); SqlSession session2= getSqlSession(); CustMapper mapper1 = session1.getMapper(CustMapper.class); CustMapper mapper2 = session2.getMapper(CustMapper.class); //二级缓存须要手工开启,具体方法是 //1.<setting name="cacheEnabled" value="true"/> //2.在Sql配置文件中加入<cache></cache>标签 Cust cust1 = mapper1.getCustById(1); session1.commit(); //session1.close(); Cust cust2 = mapper2.getCustById(1);
注:若是关联的多表查询在不配置<cache-ref>的状况下会出现脏数据,好比
在同一个业务逻辑中查帐户信息(包含了客户信息),接着更新了该帐户的客户信息表,再查该帐户信息,客户信息不会被更新。有一个办法是在客户的mapper文件中使用<cache-ref>标签应用帐户的mapper文件
另外Mybatis提供了Cache接口实现自定义缓存,使用该接口能够对接redis等第三方库实现更有用的缓存功能
若是对Mybatis缓存还须要更详细的了解,推荐你们去看看你真的会用Mybatis的缓存么,不知道原理的话,容易踩坑哦