Mybait缓存机制(四)
mybatis同大多数orm框架一样,提供了一级缓存和二级缓存的支持。
一级缓存:其作用域为session范围内,当session执行flush或close方法后,一级缓存会被清空。
二级缓存:二级缓存和一级缓存机制相同,但是可以自定义其作用范围,如ehcache。
一级缓存
在默认情况下mybatis中的一级缓存是开启的,一级缓存只在同一个sqlsession中有效不可以跨sqlsession。
@test public void testcache(){ /** * 测试一级缓存 */ sqlsession session1 = sqlsessionfactory.opensession(); employeemapper employeemapper = session1.getmapper(employeemapper.class); list<employee> list1 = employeemapper.findall(null); system.out.println(list1); list<employee> list2 = employeemapper.findall(null);//不发送语句 system.out.println(list2); }
sqlsession调用clearcache()清除缓存,或者在执行增删改操作后,sqlsession调用close(),commit()都会清理缓存。
二级缓存
mybatis中使用二级缓存也非常简单,首先开启全局二级缓存配置信息,通过开启cacheenabled,然后在对应的mapper映射文件中使用<cache />标签开启二级缓存即可。
1.select 语句获取出来的对象都会被缓存。
2.二级缓存所有实体类必须实现serializable接口。
3.所有执行 insert,update 和 delete 语句后,缓存都会被刷新。
4.必须关闭session后才会写入二级缓存中。
5.二级缓存的作用域是全局的,作用范围是映射文件级别的。只在同一类型mapper映射对象中有效。
6.查询数据时,会先查询二级缓存,再查询一级缓存,然后再查询数据库。
我们需要使用二级缓存必须在mybatis主配置文件中设置cacheenabled设置为true,并且在实体类mapper中启用缓存。
<settings> <!-- 开启驼峰式命名规则 --> <setting name="mapunderscoretocamelcase" value="true"/> <!-- 开启二级缓存 --> <setting name="cacheenabled" value="true"/> </settings>
employeemapper.xml
<!-- 使用mybatis默认二级缓存 --> <cache/>
这样就可以开启我们的二级缓存了,但是这使用至少mybatis默认的二级缓存,mybatis缓存做的并怎么的好,所有我们需要整合第三方缓存机制。
ehcache 是一个纯java的进程内缓存框架,是一种广泛使用的开源java分布式缓存,具有快速、精干等特点,是hibernate中默认的二级缓存。所以我们来整合ehcache
导入:mybatis-ehcache-1.0.3.jar ,ehcache-core-2.6.8.jar,slf4j-api-1.7.25.jar ,slf4j-log4j12-1.7.25.jar
这个时候我们只需要在实体类指定只用ehcache缓存即可
<!-- 使用第三方缓存 --> <cache type="org.mybatis.caches.ehcache.ehcachecache" />
我们可以创建ehcache.xml配置文件也可以直接配置
<cache type="org.mybatis.caches.ehcache.ehcachecache"/> <property name="timetoidleseconds" value="3600"/><!--1 hour--> <property name="timetoliveseconds" value="3600"/><!--1 hour--> <property name="maxentrieslocalheap" value="1000"/> <property name="maxentrieslocaldisk" value="10000000"/> <property name="memorystoreevictionpolicy" value="lru"/> </cache>
二级缓存属性
<cache eviction="fifo" flushinterval="60000" size="512" readonly="true"/>
和缓存相关的设置
1.核心配置文件中的cacheenabled=true|false,开启或关闭缓存(默认为true),只对二级缓存有效,对一级缓存无效。
2.在select标签中有一个属性usecache=true|false,开启当前查询标签的缓存(默认为true),也是只对二级缓存有效,对一级缓存无效。
3.在每个增删改标签中都有一个flushcache=true|false属性,设置是否清除缓存(默认为true)。一级和二级缓存都会被清空。
4.在查询中也有flushcache=true|false 属性(默认为false),如果设置为true,则每次查询之后都会清除缓存。
5.sqlsession.clearcache()方法,清除缓存。只能清除一级缓存,对二级缓存无效。
6.全局配置文件中的localcachescope属性,表示本地缓存作用域(一级缓存)。取值为session|statement。默认为session。如果设置为statement,一级缓存会被禁用掉。