Mybatis为何要求持久层的javabean序列化?

MyBatis使用SerializedCache序列化缓存来实现可读写缓存类,并通过序列化和反序列化来保证通过缓存获取数据时,得到的是一个新的实例。如果配置为只读缓存,MyBatis就会使用Map来存储缓存值,这种情况下,从缓存中获取的对象就是同一个实例。

MyBatis中配置缓存时,缓存元素<cache>有个readOnly属性,readOnly属性可以被设置为 true 或 false。只读缓存将对所有调用者返回同一个实例,因为对象没有进行序列化,所以速度最快。可写的缓存将通过序列化来返回一个缓存对象的拷贝。因为对象进行了序列化,会比较慢,但是得到的都是新的对象,线程安全。默认值是 false。即Mybatis的二级缓存默认是可写的,可写缓存会使用序列化。

序列化缓存
* 先将对象序列化成2进制,再缓存,好处是将对象压缩了,省内存
* 坏处是速度慢了(因为对象需要进行序列化)

总结:Mybatis通过序列化得到对象的新实例,保证多线程安全(因为是从缓存中取数据,速度还是比从数据库获取要快)。具体说就是对象序列化后存储到缓存中,从缓存中取数据时是通过反序列化得到新的实例。

猜你喜欢

转载自blog.csdn.net/yzh_1346983557/article/details/84786246
今日推荐