一级缓存
MyBatis的一级缓存是内置在SqlSession中的一个默认缓存,它是SqlSession级别的缓存,也称为本地缓存。一级缓存可以通过开启或关闭来控制。
工作原理
当SqlSession执行查询操作时,查询结果会被缓存到一级缓存中。当再次执行相同的查询操作时,MyBatis会首先检查一级缓存中是否存在相同的查询结果,如果存在,则直接从缓存中获取数据,而不会再次查询数据库。
缓存失效
在一级缓存中,当发生以下情况时,缓存会失效:
- 执行了commit操作,清空缓存;
- 执行了update、delete或insert操作,可能会影响到缓存中的数据,所以也会清空缓存;
- 查询条件有多个参数,并且其中一个参数发生了变化;
- SqlSession被关闭或刷新。
配置和使用
在MyBatis的配置文件中,可以通过<settings>
标签下的<setting>
标签来配置一级缓存的开启或关闭。
<settings>
<setting name="localCacheScope" value="SESSION"/>
</settings>
二级缓存
MyBatis的二级缓存是全局缓存,不同的SqlSession之间可以共享缓存数据。它是基于Mapper级别的缓存,可以缓存多个SqlSession的查询结果。 需要注意的是,默认情况下,MyBatis的二级缓存是关闭的。
工作原理
当不同的SqlSession执行相同的查询操作时,查询结果会被缓存到二级缓存中。当再次执行相同的查询操作时,MyBatis会首先检查二级缓存中是否存在相同的查询结果,如果存在,则直接从缓存中获取数据,而不会再次查询数据库。
缓存失效机制
在二级缓存中,当发生以下情况时,缓存会失效:
- 执行了commit操作,清空缓存;
- 执行了update、delete或insert操作,可能会影响到缓存中的数据,所以也会清空缓存;
- 对应的Mapper XML文件发生了变化。
配置和使用
在MyBatis的配置文件中,可以通过<cache>
标签配置二级缓存。
<cache type="org.apache.ibatis.cache.impl.PerpetualCache"/>
缓存策略
自定义缓存策略
MyBatis允许用户自定义缓存策略,用户可以实现org.apache.ibatis.cache.Cache
接口,然后通过配置文件指定自定义的缓存策略。
<cache type="com.example.MyCustomCache"/>
二级缓存的配置和刷新
在MyBatis的配置文件中,可以通过<settings>
标签下的<setting>
标签来配置二级缓存的开启或关闭。
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
在要使用二级缓存的Mapper XML文件中,可以通过<cache>
标签来配置缓存的刷新策略。
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
eviction
:缓存淘汰策略,默认为LRU(最近最少使用);flushInterval
:刷新间隔时间,单位是毫秒;size
:缓存最大容量;readOnly
:是否只读,默认为false。
总结
MyBatis的缓存机制是通过一级缓存和二级缓存来提高数据库查询性能的。一级缓存是SqlSession级别的缓存,而二级缓存是全局缓存,可以跨多个SqlSession共享。通过合理配置和使用缓存策略,可以提升系统性能并减少数据库查询的开销。在应用开发中,需要根据具体的业务场景来选择合适的缓存策略。
本文来自极简博客,作者:云计算瞭望塔,转载请注明原文链接:MyBatis缓存机制详解:从一级缓存到二级缓存的优化策略