Mybatis-二级缓存

首先,不建议使用它,由于很容易出现脏数据,因此去百度一把使用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的缓存么,不知道原理的话,容易踩坑哦

相关文章
相关标签/搜索