mysql缓存

<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。
自定义缓存
<cache type=”com.domain.something.MyCustomCache”/>

这个示例展示了如何使用一个自定义的缓存实现。 type 属性指定的类必须实现
org.mybatis.cache.Cache 接口
记得缓存配置和缓存实例是绑定在 SQL 映射文件的命名空间是很重要的。因此,所有
在相同命名空间的语句正如绑定的缓存一样。语句可以修改和缓存交互的方式,或在语句的
语句的基础上使用两种简单的属性来完全排除它们
因为那些是默认的,你明显不能明确地以这种方式来配置一条语句。相反,如果你想改
变默认的行为,只能设置 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     }
 

 

posted @ 2016-12-26 14:29  卖臭豆腐喽  阅读(1570)  评论(0编辑  收藏  举报