专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java面试题之:说一说Mybatis里面的缓存机制

temp10 2024-10-25 16:59:39 java教程 15 ℃ 0 评论

MyBatis 是一个优秀的 Java 持久层框架,它提供了强大的缓存机制来提高数据访问性能。MyBatis 的缓存机制主要分为一级缓存和二级缓存。

一级缓存

  1. 定义与作用

一级缓存也称为本地缓存,它是 MyBatis 中默认开启的缓存。一级缓存存在于 SqlSession 对象的生命周期中,当一个 SqlSession 执行查询操作后,MyBatis 会将查询结果放入一级缓存中。如果在同一个 SqlSession 中再次执行相同的查询,MyBatis 会直接从一级缓存中获取结果,而不会再次执行 SQL 查询,从而提高查询性能。例如,在一个业务方法中,多次调用同一个 Mapper 接口的查询方法,如果查询条件相同,那么第二次及以后的查询就会直接从一级缓存中获取结果,而不需要再次访问数据库。

Java面试题之:说一说Mybatis里面的缓存机制

  1. 缓存范围与失效情况

一级缓存的作用范围仅限于当前 SqlSession。当 SqlSession 执行了插入、更新或删除操作后,MyBatis 会清空当前 SqlSession 的一级缓存,以确保缓存中的数据与数据库中的数据保持一致。此外,如果在 SqlSession 中手动调用了clearCache()方法,也会清空一级缓存。例如,在一个业务方法中,先执行了查询操作,将结果放入一级缓存中,然后执行了插入操作,此时一级缓存会被清空。如果再次执行相同的查询操作,MyBatis 会重新执行 SQL 查询,并将结果放入一级缓存中。

二级缓存

  1. 定义与作用

二级缓存也称为全局缓存,它是在多个 SqlSession 之间共享的缓存。二级缓存的作用范围是 Mapper 级别的,即同一个 Mapper 接口的所有 SqlSession 都可以共享二级缓存中的数据。当一个 SqlSession 执行查询操作后,MyBatis 会将查询结果放入二级缓存中。如果其他 SqlSession 执行相同的查询,MyBatis 会先从二级缓存中获取结果,如果二级缓存中没有数据,再执行 SQL 查询。例如,在一个 Web 应用中,多个用户同时访问同一个页面,页面中的数据是通过 MyBatis 查询数据库得到的。如果开启了二级缓存,那么第一个用户查询数据后,MyBatis 会将查询结果放入二级缓存中。当其他用户访问同一个页面时,MyBatis 会先从二级缓存中获取数据,而不需要再次访问数据库,从而提高了系统的性能。

  1. 配置与使用

要使用二级缓存,需要在 Mapper XML 文件中添加<cache/>标签,并设置一些属性,如eviction(缓存回收策略)、flushInterval(刷新间隔)、size(缓存大小)等。此外,还需要在实体类中实现Serializable接口,以便 MyBatis 能够将实体类对象放入缓存中。例如,以下是一个 Mapper XML 文件中配置二级缓存的示例:

<mapper namespace="com.example.dao.UserMapper">
    <cache eviction="LRU" flushInterval="60000" size="1024"/>
    <!-- Mapper 接口中的 SQL 语句 -->
</mapper>
  1. 缓存范围与失效情况

二级缓存的作用范围是 Mapper 级别的,即不同的 Mapper 接口之间的二级缓存是相互独立的。当执行了插入、更新或删除操作时,如果对应的 Mapper 接口开启了二级缓存,并且操作影响了缓存中的数据,MyBatis 会清空该 Mapper 接口的二级缓存。此外,如果手动调用了SqlSessionFactory的clearCache()方法,也会清空所有的二级缓存。例如,在一个业务方法中,先执行了一个 Mapper 接口的查询操作,将结果放入二级缓存中。然后执行了另一个 Mapper 接口的插入操作,这个插入操作不会影响第一个 Mapper 接口的二级缓存。但是,如果执行了第一个 Mapper 接口的插入、更新或删除操作,那么这个 Mapper 接口的二级缓存会被清空。

MyBatis 的缓存机制可以有效地提高数据访问性能,减少数据库的访问次数。在实际应用中,可以根据具体的业务需求来选择使用一级缓存还是二级缓存,并合理配置缓存参数,以达到最佳的性能效果。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表