Mybatis二级缓存学习入门详解
2024/12/27 23:04:15
本文主要是介绍Mybatis二级缓存学习入门详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文详细介绍了Mybatis二级缓存的基本概念、工作原理及其优势,包括如何在配置文件中开启二级缓存,以及二级缓存的使用场景和配置选项。文章还讨论了在使用二级缓存时可能遇到的问题及解决方法,并通过实战演练展示了二级缓存的实际应用效果。
1.1 什么是Mybatis二级缓存
Mybatis二级缓存也被称为共享缓存模式,它在同一个SqlSessionFactory(负责创建SqlSession对象)中是全局共享的。二级缓存是基于命名空间的,不同的mapper.xml文件中的namespace会对应不同的缓存,因此不同的mapper.xml文件中的查询结果也可以通过二级缓存进行共享。
1.2 Mybatis缓存的工作原理
Mybatis的缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,是默认开启的,当执行查询语句后,会先从SqlSession的缓存中查找是否有对应的查询结果,如果查找到了,就直接从缓存中返回结果,而不会去数据库查询。而二级缓存是基于Mapper的缓存,需要手动开启。当SqlSession中查找缓存的结果为空时,才会去二级缓存中查找。
1.3 二级缓存相对于一级缓存的优势
- 分担了SqlSession一级缓存的压力,减少了内存占用。
- 由于二级缓存是SqlSessionFactory级别的,因此可以被多个SqlSession共享,从而提高数据共享效率。
- 当数据量较大或者查询较为频繁时,开启二级缓存可以提高查询性能。
2.1 编写配置文件开启二级缓存
在mybatis的配置文件中,可以通过<setting>
标签的cacheEnabled
属性来开启全局的二级缓存。此外,还需要在mapper.xml文件中开启具体的Mapper对应的缓存,可以通过<cache>
标签来实现。
2.2 实例代码展示
以下是一个常见的mybatis全局配置文件mybatis-config.xml
的示例,其中开启了全局的二级缓存:
<configuration> <settings> <setting name="cacheEnabled" value="true"/> </settings> <mappers> <mapper resource="com/example/mybatis/UserMapper.xml"/> </mappers> </configuration>
在mapper.xml中开启二级缓存,例如UserMapper.xml
:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mybatis.UserMapper"> <cache /> <select id="selectUserById" resultType="User"> SELECT * FROM Users WHERE id = #{id} </select> </mapper>
3.1 常见的使用二级缓存的场景
- 当应用程序中存在大量重复的查询操作时,开启二级缓存可以大大提高查询性能。
- 当应用程序需要跨多个SqlSession共享数据时,使用二级缓存可以减少对数据库的访问,提高数据共享效率。
- 在高并发场景下,二级缓存可以大大减轻数据库的压力,提高系统的整体性能。
3.2 适合使用二级缓存的数据
- 数据相对稳定且变化不频繁,例如一些配置信息。
- 需要频繁查询的数据,例如用户信息。
- 数据在多个SqlSession中需要共享的情况。
4.1 缓存的时间间隔设置
Mybatis的二级缓存默认是没有过期时间的,即一旦缓存了数据,除非显式地删除缓存,否则会一直存在。可以通过自定义缓存实现类来自定义缓存策略,例如通过Ehcache
等第三方缓存组件来实现缓存过期。以下是使用Ehcache
的示例配置:
<cache type="org.mybatis.caches.ehcache.EhcacheCache" />
4.2 缓存的刷新策略
默认情况下,当插入、更新或删除数据时,二级缓存会被自动刷新,即缓存会被标记为无效。可以通过自定义缓存实现类来实现更复杂的刷新策略。以下是一个自定义缓存实现类的示例:
public class CustomCache implements Cache { private Ehcache ehcache; public CustomCache(String id) { ehcache = new EhcacheFactory().createCache(id); } @Override public Object getObject(Object key) { Element element = ehcache.get(key); return element == null ? null : element.getObjectValue(); } @Override public Object putObject(Object key, Object value) { ehcache.put(new Element(key, value)); return value; } @Override public Object removeObject(Object key) { Element element = ehcache.get(key); if (element != null) { ehcache.remove(element); } return element == null ? null : element.getObjectValue(); } @Override public void clear() { ehcache.removeAll(); } @Override public int getSize() { return ehcache.getSize(); } @Override public String getId() { return ehcache.getCacheName(); } }
5.1 数据不一致问题
当缓存被刷新后,可能会导致缓存中的数据和数据库中的数据不一致。为了解决这个问题,可以在插入、更新或删除数据时,使用flushCache
方法强制刷新缓存,或者使用useCache
属性来控制是否使用缓存。以下是一个示例:
<insert id="insertUser" flushCache="true"> INSERT INTO Users (id, name, email) VALUES (#{id}, #{name}, #{email}) </insert>
5.2 缓存失效的情况处理
当缓存失效时,Mybatis会从数据库中重新查询数据。如果查询操作非常频繁,可能会导致数据库压力过大。可以通过调整缓存过期时间,或者使用分布式缓存来提高缓存命中率。以下是一个调整缓存过期时间的示例:
<cache type="org.mybatis.caches.ehcache.EhcacheCache"> <property name="timeToLiveSeconds" value="600"/> </cache>
6.1 小项目演示二级缓存的作用
以下是一个简单的例子,演示了如何在Mybatis中使用二级缓存。假设我们有一个UserMapper
接口,用于查询用户信息:
public interface UserMapper { User selectUserById(int id); }
对应的mapper.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.mybatis.UserMapper"> <cache /> <select id="selectUserById" resultType="User"> SELECT * FROM Users WHERE id = #{id} </select> </mapper>
在应用程序中使用SqlSession
进行查询:
public class Main { public static void main(String[] args) { SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml")); SqlSession session = factory.openSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUserById(1); System.out.println(user); // 模拟其他SqlSession查询相同的用户数据 SqlSession session2 = factory.openSession(); UserMapper mapper2 = session2.getMapper(UserMapper.class); User user2 = mapper2.selectUserById(1); System.out.println(user2); } }
通过上述代码,可以看到用户数据只从数据库查询了一次,第二次查询时直接从缓存中获取了数据,展示了二级缓存的高效性。
6.2 常见代码错误及修正技巧
错误1:未开启二级缓存
<mapper namespace="com.example.mybatis.UserMapper"> <select id="selectUserById" resultType="User"> SELECT * FROM Users WHERE id = #{id} </select> </mapper>
修正:
<mapper namespace="com.example.mybatis.UserMapper"> <cache /> <select id="selectUserById" resultType="User"> SELECT * FROM Users WHERE id = #{id} </select> </mapper>
错误2:缓存刷新策略不正确
<mapper namespace="com.example.mybatis.UserMapper"> <cache /> <insert id="insertUser" flushCache="false"> INSERT INTO Users (id, name, email) VALUES (#{id}, #{name}, #{email}) </insert> </mapper>
修正:
<mapper namespace="com.example.mybatis.UserMapper"> <cache /> <insert id="insertUser" flushCache="true"> INSERT INTO Users (id, name, email) VALUES (#{id}, #{name}, #{email}) </insert> </mapper>
这篇关于Mybatis二级缓存学习入门详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-03Springboot企业级开发资料入门教程
- 2025-01-03SpringBoot企业级开发资料入门教程
- 2025-01-03Springboot微服务资料入门教程
- 2025-01-03Springboot项目开发资料:新手入门教程
- 2025-01-03Springboot项目开发资料:新手入门指南
- 2025-01-03SpringCloud Alibaba资料入门教程
- 2025-01-03SpringCloud Alibaba资料详解与入门教程
- 2025-01-03SpringCloud微服务资料入门教程
- 2025-01-03单元化架构最佳实践指南!
- 2025-01-03SpringCloud项目开发资料入门教程