MyBatis 一级缓存和二级缓存是什么数据结构?
MyBatis 的一级缓存和二级缓存的数据结构主要是基于HashMap
实现的。
- 一级缓存(Session Cache): MyBatis 的一级缓存是基于
PerpetualCache
(永久缓存)实现的,而PerpetualCache
内部使用了 Java 的HashMap
作为存储结构。每个SqlSession
都有一个自己的一级缓存,当SqlSession
关闭或提交时,该SqlSession
的一级缓存就会清空。 -
二级缓存(Mapper Cache): MyBatis 的二级缓存同样是基于
PerpetualCache
实现的,PerpetualCache
内部使用HashMap
作为存储结构。二级缓存是跨SqlSession
的,对于同一个SqlSessionFactory
,多个SqlSession
可以共享其二级缓存。当调用SqlSession
的clearCache
方法时,就会清空当前SqlSessionFactory
的二级缓存。
在实际使用中,二级缓存还可以通过装饰者模式添加各种装饰器,例如FifoCache
(先进先出缓存)、LruCache
(最少使用缓存)、SoftCache
(软引用缓存)等,以实现更多的缓存策略。
需要注意的是,无论是一级缓存还是二级缓存,都不适合用于存储大量数据,因为它们都是基于内存的缓存,如果存储大量数据,可能会导致内存溢出。同时,MyBatis 的缓存都是本地缓存,不适合在分布式环境中使用。如果在分布式环境中需要使用缓存,可以考虑使用如Redis等分布式缓存解决方案。