zoukankan      html  css  js  c++  java
  • 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     }
     

     

  • 相关阅读:
    mysql-03
    mysql-02
    mysql-01
    RESTFUL设计风格
    mysql水平拆分和垂直拆分
    redis连环夺命问
    Python 的十大重要特性
    吊打--redis
    python2和3 的区别
    tornado第一段代码
  • 原文地址:https://www.cnblogs.com/zhangXingSheng/p/6222217.html
Copyright © 2011-2022 走看看