在学习Hibernate中,经常有看到一级缓存和二级缓存的概念,并且有了解到,一级缓存是session级别的缓存一般缓存在内存中,二级缓存是指sessionfactory级别的缓存,一般缓存在内存或者物理介质中。
一级缓存是在
BaseExecutor中的通过
localCache进行处理,这个缓存是默认开启的。是属于事物一个Conn内的缓存。
二级缓存是在
CachingExecutor进行处理,并通过
TransactionalCacheManage r
进行管理,这个缓存是需要通过配置的方式设定开启,缓存范围是SqlSession级别的
。默认是
PerpetualCache进行二级缓存的处理,但是也可以通过配置的方式,手动执行缓存的执行类,该执行类需要继承接口org.apache.ibatis.cache.Cache。
在二级缓存的管理中,可以分成两个阶段,一个是query的时候,缓存的临时存放,存放在TransactionalCache,一个阶段是commit的时候,缓存会存放到
CacheingExecutor对象中的TransactionCache数据结构中。
但是在MyBatis中,这两天看源码的时候,好像MyBatis中的缓存的定义和Hibernate中的有所不同。
在Query的时候,程序执行如下:
而在commit的时候,MyBatis会将缓存数据通过装饰器模式,进行事物的异步控制、日志管理、序列化、内存管理等。执行过程如下: