MyBatis的三级缓存

MyBatis的三级缓存

一、什么是MyBatis的三级缓存?

MyBatis的三级缓存指的是一级缓存、二级缓存和三级缓存。

缓存是一种提高数据读取性能的技术,在MyBatis中,一级缓存指的是Session缓存,二级缓存指的是Mapper级的缓存,三级缓存则是全局的,对所有的mapper有效的缓存。

通过缓存,我们可以避免频繁地对数据库进行查询,从而提高应用程序的性能。

二、一级缓存

一级缓存是MyBatis的核心缓存,是SqlSession级别的,这意味着只要在同一个SqlSession中,相同的查询就会从缓存中取得结果。

看下面的示例代码:

SqlSession session = factory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user1 = mapper.selectById(1);
User user2 = mapper.selectById(1);
System.out.println(user1 == user2);

同一个SqlSession内,重复查询一次,发现并没有执行查询操作,返回的两个对象完全相同。

三、二级缓存

二级缓存是Mapper级的缓存,这种缓存对于同一个namespace下的所有SqlSession都是有效的。

<cache/>

只需要在mapper.xml中添加此配置,MyBatis就会在这个namespace下启用二级缓存。

二级缓存的测试代码如下:

SqlSession session1 = factory.openSession();
UserMapper mapper1 = session1.getMapper(UserMapper.class);
User user1 = mapper1.selectById(1);
session1.close();

SqlSession session2 = factory.openSession();
UserMapper mapper2 = session2.getMapper(UserMapper.class);
User user2 = mapper2.selectById(1);
session2.close();

System.out.println(user1 == user2);

可以看到,虽然是两个SqlSession,但是由于启用了二级缓存,所以相同的查询只执行了一次。

四、三级缓存

三级缓存是全局缓存,对所有的mapper都有效。MyBatis并未直接提供接口支持全局缓存,但是可以通过整合Ehcache,Redis等工具来实现。


<cache name="User"
       maxElementsInMemory="10000"
       eternal="false"
       timeToIdleSeconds="120"
       timeToLiveSeconds="120"
       overflowToDisk="false"
       memoryStoreEvictionPolicy="LRU"/>

关于三级缓存的具体实现和使用可以参考官方文档和相关资料。

总结

通过MyBatis的三级缓存,可以大大提高我们对数据库的查询效率,但是也需要注意,缓存也可能会导致脏读、幻读等问题,这些都需要在实际开发中去考虑和权衡。

MyBatis 的一级缓存 二级缓存 都不建议使用,它们只适用于单体项目,现在基本都是分布式或者微服务 框架使用的话会存在数据不一致问题。
在我开发这几年,用的都是微服务架构。也没用过Mybatis的缓存也不够灵活,都是手动在代码中做的redis缓存。手动在代码中做redis缓存我觉得更灵活。

你可能感兴趣的:(#,Java,mybatis,缓存,spring)