在Mybatis的二级缓存中可以设置各种属性,这些属性可以通过 cache 元素的属性来修改。比如:

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

其他的属性都容易理解,就readOnly属性,很多人存在疑问。其官网解释说明是这样的:

readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。速度上会慢一些,但是更安全,因此默认值是 false。

也就是说,当你设置readOnly=true的时候,cache里面存放对象引用,用户A从cache里面取出对象之后,如果A对对象进行了修改,其他用户B再从cache取出对象,则会发现对象已经被修改。设置ReadOny=True的目的是:告诉用户不要从缓存中取出之后,对对象进行修改。

cache里面存放对象的序列化,用户A从cache里面取出对象之后,如果A对对象进行了修改,其他用户B再从cache取出对象,对象是不会变的。设置ReadOny=False的目的是:告诉用户从缓存中取出之后,可以对对象进行修改,而不影响cache里面的对象。

虽然官网强调:只读的缓存会给所有调用者返回缓存对象的相同实例。但是在使用Redis的情况下,即便设置为:readOnly="true",那么每次取到对象也是不一样的,因为中间有个序列化的过程。

<cache type="org.mybatis.caches.redis.RedisCache" eviction="LRU" flushInterval="300000" size="128" readOnly="true" />

这个网友的疑惑:https://segmentfault.com/q/1010000019059197,就是没有真正的搞明白:readOnly和序列化的关系。

标签: none


添加新评论