美文网首页
MyBatis缓存配置

MyBatis缓存配置

作者: Doooook | 来源:发表于2020-07-19 10:28 被阅读0次

    这篇我们讲MyBatis的缓存配置,关于MyBatis缓存请参看MyBatis缓存
    在xml配置爱中添加如下内容:

    <cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>
    <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer">
        select 
        <include refid="Base_Column_List" />
        from t_student
        where id = #{id,jdbcType=INTEGER}
      </select>
    

    这里我们讨论一下它们的属性。

    • eviction:代表的是缓存回收策略,目前MyBatis提供以下策略。
      (1)LRU,最近最少使用的,移除最长时间不用的对象。
      (2)FIFO,先进先出,按对象进入缓存的顺序来移除它们。
      (3)SOFT,软引用,移除基于垃圾回收器状态和软引用规则的对象。
      (4)WEAK,弱引用,更积极地移除基于垃圾收集器状态和弱引用规则的对象。这里采用的是LRU,移除最长时间不用的对象。
    • flushInterval:刷新间隔时间,单位为毫秒,这里配置的是100秒刷新,如果你不配置它,那么当SQL被执行的时候才会去刷新缓存。
    • size:引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。这里配置的是1024个对象。
    • readOnly:

    只读,属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。速度上会慢一些,但是更安全,因此默认值是 false。
    (1)只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。速度上会慢一些,但是更安全,因此默认值是 false。
    (2)也就是说,当你设置readOnly=true的时候,cache里面存放对象引用,用户A从cache里面取出对象之后,如果A对对象进行了修改,其他用户B再从cache取出对象,则会发现对象已经被修改。设置readOny=true的目的是:告诉用户不要从缓存中取出之后,对对象进行修改。
    (3)cache里面存放对象的序列化,用户A从cache里面取出对象之后,如果A对对象进行了修改,其他用户B再从cache取出对象,对象是不会变的。设置readOny=false的目的是:告诉用户从缓存中取出之后,可以对对象进行修改,而不影响cache里面的对象。

    <!-- 可以在Mapper的具体方法下设置对二级缓存的访问意愿:
        1. useCache配置,如果一条语句每次都需要最新的数据,就意味着每次都需要从数据库中查询数据,可以把这个属性设置为false
        2. 刷新缓存(就是清空缓存),二级缓存默认会在insert、update、delete操作后刷新缓存,可以手动配置不更新缓存
      -->
    
      <!--
        1)当为select语句时:
          flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。
          useCache默认为true,表示会将本条语句的结果进行二级缓存。
        2)当为insert、update、delete语句时:
          flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。
          useCache属性在该情况下没有。
          update 的时候如果 flushCache="false",则当你更新后,查询的数据数据还是老的数据。
      -->
    <!--  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" useCache="false" flushCache="true">-->
    <!--  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" useCache="false" flushCache="true">-->
      <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" flushCache="true">
        select
        <include refid="Base_Column_List" />
        from t_student
        where id = #{id,jdbcType=INTEGER}
      </select>
    

    相关文章

      网友评论

          本文标题:MyBatis缓存配置

          本文链接:https://www.haomeiwen.com/subject/qtjlkktx.html