<cache/>
字面上看就是这样。这个简单语句的效果如下: 映射语句文件中的所有 select 语句将会被缓存。 映射语句文件中的所有 insert, update 和 delete 语句会刷新缓存。 缓存会使用 Least Recently Used( LRU,最近最少使用的)算法来收回。 根据时间表(比如 no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序 来刷新。 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。所有的这些属性都可以通过缓存元素的属性来修改。比如:
可用的收回策略有: LRU – 最近最少使用的:移除最长时间不被使用的对象。 FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。 WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。 默认的是 LRU。
自定义缓存
记得缓存配置和缓存实例是绑定在 SQL 映射文件的命名空间是很重要的。因此,所有 在相同命名空间的语句正如绑定的缓存一样。语句可以修改和缓存交互的方式,或在语句的 语句的基础上使用两种简单的属性来完全排除它们
因为那些是默认的,你明显不能明确地以这种方式来配置一条语句。相反,如果你想改 变默认的行为,只能设置 flushCache 和 useCache 属性。
cache-ref 元素来引用另外一个缓存。
*******************************************************************************************
mybatis 也有一级二级缓存
一级缓存的作用域时session级别,基于PerpetualCache的hashMap的本地缓存, 数据存储在session 中,当session fush或close后,
session中所有的信息将被清空
二级缓存与一级缓存的实现机制相同,也是基于PerpetualCache 的hashMao的本地缓存,但是其作用域是mapper(nameSpace)但是
可以自定义存储数据源,如Ehcache.
一级缓存是默认开启的,开启二级缓存需要在mapper.xml文件添加如下配置
示例: /*16 * 测试二级缓存17 * 使用两个不同的SqlSession对象去执行相同查询条件的查询,第二次查询时不会再发送SQL语句,而是直接从缓存中取出数据18 */19 @Test20 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 }