<cache/>
字面上看就是这样。这个简单语句的效果如下:
映射语句文件中的所有 select 语句将会被缓存。
映射语句文件中的所有 insert, update 和 delete 语句会刷新缓存。
缓存会使用 Least Recently Used( LRU,最近最少使用的)算法来收回。
根据时间表(比如 no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序
来刷新。
缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而
且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
所有的这些属性都可以通过缓存元素的属性来修改。比如:
<cache eviction="FIFO" //先进先出:按对象进入缓存的顺序来移除它们。 flushInterval="60000" //每隔 60 秒刷新 size="512" //存数结果对象或列表的512 个引用 readOnly="true" //返回的对象被认为是只读的 />
可用的收回策略有:
LRU – 最近最少使用的:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
默认的是 LRU。
LRU – 最近最少使用的:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
默认的是 LRU。
自定义缓存
<cache type=”com.domain.something.MyCustomCache”/>
这个示例展示了如何使用一个自定义的缓存实现。 type 属性指定的类必须实现
org.mybatis.cache.Cache 接口
记得缓存配置和缓存实例是绑定在 SQL 映射文件的命名空间是很重要的。因此,所有
在相同命名空间的语句正如绑定的缓存一样。语句可以修改和缓存交互的方式,或在语句的
语句的基础上使用两种简单的属性来完全排除它们
在相同命名空间的语句正如绑定的缓存一样。语句可以修改和缓存交互的方式,或在语句的
语句的基础上使用两种简单的属性来完全排除它们
因为那些是默认的,你明显不能明确地以这种方式来配置一条语句。相反,如果你想改
变默认的行为,只能设置 flushCache 和 useCache 属性。
变默认的行为,只能设置 flushCache 和 useCache 属性。
cache-ref 元素来引用另外一个缓存。
<cache-ref namespace=”com.someone.application.data.SomeMapper”/>
*******************************************************************************************
mybatis 也有一级二级缓存
一级缓存的作用域时session级别,基于PerpetualCache的hashMap的本地缓存, 数据存储在session 中,当session fush或close后,
session中所有的信息将被清空
二级缓存与一级缓存的实现机制相同,也是基于PerpetualCache 的hashMao的本地缓存,但是其作用域是mapper(nameSpace)但是
可以自定义存储数据源,如Ehcache.
一级缓存是默认开启的,开启二级缓存需要在mapper.xml文件添加如下配置
<mapper namespace="me.gacl.mapping.userMapper"><!-- 开启二级缓存 --><cache/> 示例: /*16 * 测试二级缓存 17 * 使用两个不同的SqlSession对象去执行相同查询条件的查询,第二次查询时不会再发送SQL语句,而是直接从缓存中取出数据 18 */19 @Test 20 public void testCache2() { 21 String statement = "me.gacl.mapping.userMapper.getUser"; 22 SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory(); 23 //开启两个不同的SqlSession24 SqlSession session1 = factory.openSession(); 25 SqlSession session2 = factory.openSession(); 26 //使用二级缓存时,User类必须实现一个Serializable接口===> User implements Serializable27 User user = session1.selectOne(statement, 1); 28 session1.commit();//这个地方要commit(),因为二级缓存是在mapper.xml的cache中取的,不commit数据就不会存储到 mapper.xml文件中,也就取不到缓存 29 System.out.println("user="+user); 3031 //由于使用的是两个不同的SqlSession对象,所以即使查询条件相同,一级缓存也不会开启使用32 user = session2.selectOne(statement, 1); 33 //session2.commit();34 System.out.println("user2="+user); 35 }