MyBatis默认会启用缓存机制吗?如果需要启用,应该怎么做?
参考回答
MyBatis 默认情况下并不会启用二级缓存,但它会启用 一级缓存,并且一级缓存是默认开启的,开发者无需做任何配置。对于 二级缓存,如果需要使用,它是 可选的,需要在配置文件中显式启用。
启用二级缓存的步骤:
- 在
mybatis-config.xml配置文件中启用全局缓存:
在mybatis-config.xml文件中,<settings>标签下的cacheEnabled配置项默认是true,它表示是否启用缓存(一级缓存和二级缓存)。如果你需要启用缓存,确保该项值为true。<configuration> <settings> <!-- 启用全局缓存,默认为 true --> <setting name="cacheEnabled" value="true"/> </settings> </configuration> - 在 Mapper 映射文件中启用二级缓存:
在每个 Mapper 文件的<mapper>标签中,加入<cache>标签来启用二级缓存。这个标签可以直接启用二级缓存,或者通过配置type属性来指定使用的缓存实现。
- 默认启用二级缓存(使用 MyBatis 内置的缓存实现):
“`xml
<mapper namespace="com.example.UserMapper">
<cache/>
<select id="selectUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
“` - 启用指定类型的缓存(例如使用
EHCache):“`xml
<mapper namespace="com.example.UserMapper">
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
<select id="selectUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
“`
-
(可选)在
mybatis-config.xml中配置缓存实现(如 EHCache 或其他):
如果使用EHCache或其他外部缓存框架,需要在 MyBatis 配置文件中添加相应的依赖和配置。<configuration> <plugins> <plugin interceptor="org.mybatis.caches.ehcache.EhcacheCache"/> </plugins> </configuration>
详细讲解与拓展
1. 一级缓存的启用
MyBatis 的 一级缓存 是默认启用的,并且它与 SqlSession 的生命周期相关。也就是说,只要一个 SqlSession 没有关闭,查询的结果就会被缓存到一级缓存中。如果在同一个 SqlSession 中多次查询相同的数据,MyBatis 会直接从一级缓存中获取数据,而不需要再次查询数据库。
一级缓存的启用是隐式的,开发者无需做额外的配置。每次执行查询时,MyBatis 会先检查一级缓存,如果缓存中有数据,直接返回结果;否则,执行数据库查询并将结果存储到一级缓存中。
2. 二级缓存的启用
二级缓存是跨 SqlSession 的缓存,它可以共享多个 SqlSession 的缓存数据。不同于一级缓存,它是 可选的,并且需要显式启用。
- 启用全局缓存:在
mybatis-config.xml文件的<settings>部分,确保cacheEnabled设置为true(默认已经是true),表示开启缓存机制。这会影响一级缓存和二级缓存的工作。<configuration> <settings> <!-- 启用全局缓存 --> <setting name="cacheEnabled" value="true"/> </settings> </configuration> - 在 Mapper 中启用二级缓存:对于每个 Mapper 文件,需要通过
<cache>标签显式启用二级缓存。如果没有该标签,二级缓存不会被使用。MyBatis 会使用PerpetualCache作为默认的缓存实现,除非你指定其他的缓存类型(例如使用EHCache、Redis等)。<mapper namespace="com.example.UserMapper"> <!-- 启用二级缓存 --> <cache/> <select id="selectUserById" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>
3. 配置外部缓存实现(如 EHCache 或 Redis)
如果你希望使用外部缓存框架(如 EHCache、Redis 等),你需要在配置文件中添加外部缓存的支持,并在 Mapper 文件中指定使用的缓存类型。
- 使用
EHCache:<mapper namespace="com.example.UserMapper"> <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> <select id="selectUserById" resultType="User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>- 配置 EHCache:
你还需要在mybatis-config.xml中配置 EHCache 的支持,并确保已经在项目中引入了 EHCache 相关的依赖。
<configuration> <plugins> <plugin interceptor="org.mybatis.caches.ehcache.EhcacheCache"/> </plugins> </configuration> - 配置 EHCache:
-
使用
Redis:
MyBatis 不直接提供 Redis 的缓存支持,你需要自己实现一个Cache接口,或者使用第三方插件来集成 Redis。常见的做法是通过Jedis或Lettuce来连接 Redis,并实现缓存的读取、写入、失效等操作。
4. 缓存清除与失效机制
-
一级缓存:一级缓存会在
SqlSession提交或回滚时清空。此外,当执行增、删、改操作时,一级缓存中的相关数据也会失效。 -
二级缓存:二级缓存需要手动管理数据失效。通常,执行
insert、update、delete等修改操作时,会使相关缓存数据失效,保证缓存中存储的是最新的数据。对于外部缓存(如 Redis、EHCache 等),失效和更新策略通常由缓存框架自己提供。
5. 注意事项
-
性能考虑:缓存机制能够显著提高系统性能,尤其是当查询频繁且数据不经常变动时,能够减少数据库的访问压力。然而,缓存可能会导致数据过时的问题,因此需要合理设计缓存的失效策略。
-
缓存策略:在实际使用中,开发者可以根据业务场景设计合适的缓存策略。例如,使用 LRU(最近最少使用)缓存,或者设置缓存的过期时间等。
总结
- 一级缓存:MyBatis 默认启用,它的作用范围仅限于当前
SqlSession,当SqlSession关闭时缓存会被清空。一级缓存默认开启,开发者不需要额外配置。 - 二级缓存:需要显式启用,并且可以在每个 Mapper 文件中通过
<cache>标签配置。二级缓存是跨SqlSession的缓存,可以通过配置不同的缓存实现(如EHCache、Redis等)来优化性能。 - 启用二级缓存时,确保
mybatis-config.xml文件中的cacheEnabled配置为true,并且在每个Mapper文件中显式启用二级缓存。