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的时候,程序执行如下:
MyBatis源码研究-缓存

而在commit的时候,MyBatis会将缓存数据通过装饰器模式,进行事物的异步控制、日志管理、序列化、内存管理等。执行过程如下:
MyBatis源码研究-缓存

posted on 2014-03-20 20:14  分布式编程  阅读(114)  评论(0编辑  收藏  举报

导航