MyBatis默认会启用缓存机制吗?如果需要启用,应该怎么做?
参考回答
MyBatis 默认情况下并不会启用二级缓存,但它会启用 一级缓存,并且一级缓存是默认开启的,开发者无需做任何配置。对于 二级缓存,如果需要使用,它是 可选的,需要在配置文件中显式启用。
启用二级缓存的步骤:
- 在
mybatis-config.xml
配置文件中启用全局缓存:
在mybatis-config.xml
文件中,<settings>
标签下的cacheEnabled
配置项默认是true
,它表示是否启用缓存(一级缓存和二级缓存)。如果你需要启用缓存,确保该项值为true
。 - 在 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 配置文件中添加相应的依赖和配置。
详细讲解与拓展
1. 一级缓存的启用
MyBatis 的 一级缓存 是默认启用的,并且它与 SqlSession
的生命周期相关。也就是说,只要一个 SqlSession
没有关闭,查询的结果就会被缓存到一级缓存中。如果在同一个 SqlSession
中多次查询相同的数据,MyBatis 会直接从一级缓存中获取数据,而不需要再次查询数据库。
一级缓存的启用是隐式的,开发者无需做额外的配置。每次执行查询时,MyBatis 会先检查一级缓存,如果缓存中有数据,直接返回结果;否则,执行数据库查询并将结果存储到一级缓存中。
2. 二级缓存的启用
二级缓存是跨 SqlSession
的缓存,它可以共享多个 SqlSession
的缓存数据。不同于一级缓存,它是 可选的,并且需要显式启用。
- 启用全局缓存:在
mybatis-config.xml
文件的<settings>
部分,确保cacheEnabled
设置为true
(默认已经是true
),表示开启缓存机制。这会影响一级缓存和二级缓存的工作。 - 在 Mapper 中启用二级缓存:对于每个 Mapper 文件,需要通过
<cache>
标签显式启用二级缓存。如果没有该标签,二级缓存不会被使用。MyBatis 会使用PerpetualCache
作为默认的缓存实现,除非你指定其他的缓存类型(例如使用EHCache
、Redis
等)。
3. 配置外部缓存实现(如 EHCache 或 Redis)
如果你希望使用外部缓存框架(如 EHCache
、Redis
等),你需要在配置文件中添加外部缓存的支持,并在 Mapper
文件中指定使用的缓存类型。
- 使用
EHCache
:- 配置 EHCache:
你还需要在mybatis-config.xml
中配置 EHCache 的支持,并确保已经在项目中引入了 EHCache 相关的依赖。
- 配置 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
文件中显式启用二级缓存。
人机验证(防爬虫)
