这篇我们讲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>
网友评论