在MyBatis中,缓存分为一级缓存和二级缓存,它们的主要目的是减少数据库的访问次数,提高查询效率。下面简述这两种缓存的工作原理:
一、 一级缓存(SqlSession级别的缓存)
一级缓存是MyBatis默认开启的缓存机制,作用范围是SqlSession级别。也就是说,只要在一个SqlSession中执行了相同的SQL语句,MyBatis会自动使用一级缓存来避免重复查询数据库。
1、工作原理
当第一次查询某个数据时,MyBatis会将查询结果存储在SqlSession的缓存中。如果在同一SqlSession中再次执行相同的查询语句,MyBatis会优先从缓存中获取结果,而不会再次查询数据库。
2、失效场景
(1)当SqlSession被关闭或提交后,一级缓存就会失效。
(2)执行了增删改操作(如insert、update、delete),会清空一级缓存。
(3)查询条件不同、SQL语句不同等情况也会导致缓存不命中。
二、二级缓存(Mapper级别的缓存)
二级缓存的作用范围比一级缓存更广,它是Mapper级别的缓存,默认情况下是关闭的。多个SqlSession可以共享同一个Mapper的二级缓存,因此它的作用范围跨越了多个SqlSession。
1、工作原理
当一个SqlSession执行查询后,查询结果不仅会被存入一级缓存,还会被存入二级缓存。当其他SqlSession执行相同查询时,可以直接从二级缓存中获取结果,而不需要再次查询数据库。二级缓存的数据通常会存储在第三方缓存组件中(如Ehcache、Redis等)。
2、启用方式
(1)在mybatis-config.xml中配置<setting name="cacheEnabled" value="true"/>,这是全局开关。
(2)在Mapper XML文件中添加<cache/>标签来开启当前Mapper的二级缓存。
3、失效场景
(1)默认情况下,二级缓存会在执行增删改操作时被清空。
(2)可以通过配置flushInterval(定期刷新)、size(缓存条目数量限制)、readOnly(是否只读缓存)等属性来控制缓存的行为。
三、 总结
(1)一级缓存:作用于单个SqlSession,自动开启,生命周期与SqlSession相同。
(2)二级缓存:作用于多个SqlSession,需要手动开启,可以在Mapper级别共享缓存。
合理使用缓存可以显著提升系统的性能,但也需要注意缓存的时效性和一致性问题。