MyBatis源码研究-缓存
在学习Hibernate中,经常有看到一级缓存和二级缓存的概念,并且有了解到,一级缓存是session级别的缓存一般缓存在内存中,二级缓存是指sessionfactory级别的缓存,一般缓存在内存或者物理介质中。
但是在MyBatis中,这两天看源码的时候,好像MyBatis中的缓存的定义和Hibernate中的有所不同。
一级缓存是在BaseExecutor中的通过localCache进行处理,这个缓存是默认开启的。是属于事物一个Conn内的缓存。
二级缓存是在CachingExecutor进行处理,并通过TransactionalCacheManager进行管理,这个缓存是需要通过配置的方式设定开启,缓存范围是SqlSession级别的。默认是PerpetualCache进行二级缓存的处理,但是也可以通过配置的方式,手动执行缓存的执行类,该执行类需要继承接口org.apache.ibatis.cache.Cache。
在二级缓存的管理中,可以分成两个阶段,一个是query的时候,缓存的临时存放,存放在TransactionalCache,一个阶段是commit的时候,缓存会存放到CacheingExecutor对象中的TransactionCache数据结构中。
在Query的时候,程序执行如下:
而在commit的时候,MyBatis会将缓存数据通过装饰器模式,进行事物的异步控制、日志管理、序列化、内存管理等。执行过程如下:
如果你喜欢本文, 请长按二维码,关注公众号 分布式编程.
作者:分布式编程
出处:https://zthinker.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。