和大多数ORM框架一样,为了尽可能减少数据库的访问,MyBatis设计支持缓存功能。设计上通过Cache接口提供SPI(服务提供接口),可以让第三方缓存提供具体的缓存实现,比如使用ehcache、Redis等,通过这些常用环境提供的实现类,即可将其配置成MyBatis中使用的缓存。
除了给第三方缓存提供SPI接口外,MyBatis自身也通过HashMap做了简单的缓存实现。总体上MyBatis缓存设计分为一级缓存和二级缓存。
MyBatis一级缓存是SqlSession级别的本地缓存,默认开启不支持配置,缓存生命周期与SqlSession生命周期相同,一级缓存只是简单的实现,没考虑SQLSession对象查询数据太多导致缓存HashMap太大而导致OOM,也没有更新缓存和缓存过期的概念,不过一般SqlSession对象的生存时间很短,且增删改时都会清空缓存数据,所以MyBatis最初这样设计。
MyBatis二级缓存是Mapper命名空间的缓存,支持跨多个Sqlsession对象使用,需要在Mapper xml文件中配置开启,并可指定使用第三方缓存或自定义缓存。在开启二级缓存的情况下可配置单条select语句是否缓存,也可配置单条增、删、改语句是否刷新缓存。MyBatis二级缓存默认最近最少使用规则淘汰历史数据。无法处理一批记录中单条记录更新的问题(一批记录缓存后因为其中单条记录修改而要清空缓存重新加载)。