如何理解Mybatis二级缓存配置中的readOnly?

353人浏览 / 0人评论

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

其他的属性都容易理解,就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",那么每次取到对象也是不一样的,因为中间有个序列化的过程。

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

全部评论

晴天下起了小雨
2017-10-01 18:00
很喜欢,果断关注了
wjmyly7336064
2017-10-01 18:00
相当实用,赞美了
橘大佬
2017-10-01 18:00
就是有些细节再到位点就好了…