MyBatis功能点之一(补充):MyBatis缓存Cache包
从MyBatis功能点之一(1):MyBatis缓存初体验中,可知二级缓存是跨session的,而一级缓存不是。为什么呢?通过Mybatis源码分析,一级缓存默认使用底层数据结构为PerpetualCache为数据查询提供效率。同时MyBatis不止实现了PerpetualCache,还有其他实现提供其他功能,如下:
可以从UML图上看,除了PerpetualCache是Cache的具体实现,其他它是Cache的装饰器类(其特点是每个类自身有一个Cache接口的属性,即类本身装饰器自身)。
在Mybatis查询一二级的缓存中有介绍PerpetualCache这个实现类,但是使用的范围不同导至缓存的使用范围也不同。本文中主要介绍Cache的其他装饰器类。
按功能分类,缓存装饰器类可以分为以下几类:
同步装饰器:为缓存增加同步功能,SynchronizedCache;
日志装饰器:为缓存增加日志功能,LoggingCache;
清理装饰器:为缓存中的数据增加清理功能,FifoCache,LruCache,WeakCache,SoftCache等;
阻塞装饰器:为缓存增加阻塞功能,BlockingCache;
定时清理装饰器:为缓存增加定时刷新功能, ScheduledCache;
系列化装饰器:为缓存增加序列化功能,SerialzedCache;
事务装饰器:用于支持事务操作,TransactionalCache。
这类装饰器缓存是如何组建的呢?在CacheBuilder类源码中可以得到答案:
从上图看,Mybatis默认使用了清理缓存LruCache。