mybatis缓存机制
mybatis有一级缓存、二级缓存,并且预留了三级缓存的接口。
-
一级缓存
一级缓存也叫本地缓存,MyBatis 的一级缓存是在会话(SqlSession)层面进行缓存的。
MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
当调用SqlSession的clearCache(),或者DML(insert|update|delete)操作时,会清空缓存。 -
二级缓存
二级缓存是namespace 级别的,可以被多个SqlSession 共享。
二级缓存总开关默认是开启的。只需要在*Mapper.xml文件中配置<'cache/>标签即可。
比如 <'cache eviction=“LRU” flushInterval=“120000” readOnly=“false” type=“org.mybatis.caches.memcached.MemcachedCache”>
与第三方分布式缓存框架(如redis、memcached和ehcache)集成方式。
回收策略:
-
LRU – 最近最少使用的:移除最长时间不被使用的对象。
-
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
-
SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。
-
WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
注意:
二级缓存需要将查询结果映射到POJO对象时,POJO对象需要实现java.io.Serializable接口,进行序列化和反序列化操作。如果存在父类、成员POJO都需要实现序列化接口。