mybatis二级缓存
1、什么情况下用mybatis二级缓存?在数据变化频率不高的情况下用二级缓存。
2、怎么设置使用二级缓存:
<select id="selectByMinSalary" resultMap="BaseResultMap" parameterType="java.util.Map" useCache="true">
3、怎么设置不用一级缓存:
<select id="selectSomething" resultType="YourResultType" flushCache="true"> SELECT * FROM your_table WHERE id = #{id} </select>
4、一级缓存的使用场景
一级缓存适用于一个数据库会话中需要多次查询相同数据的情况。例如,在Web应用中,每个用户的会话(Session)都是独立的。如果用户在会话期间多次请求相同的数据,一级缓存可以确保这些请求不需要每次都查询数据库,从而提高性能。
5、一级缓存的失效条件
一级缓存会在以下情况下失效:
- 不同的SqlSession:如上所述,一级缓存仅对当前SqlSession有效。因此,当使用不同的SqlSession时,一级缓存不会共享数据。
- 执行增删改操作:当在同一个SqlSession中执行了增删改操作时,MyBatis会把该SqlSession的缓存清空。这是为了确保缓存中的数据与数据库中的数据保持一致。
6.范围:二级缓存针对一个sql,一级缓存针对一个sqlsession.
二级缓存与一级缓存的区别:
MyBatis是一个优秀的持久层框架,它提供了一级缓存和二级缓存来提高性能。相较于一级缓存,MyBatis的二级缓存主要具备以下优势:
缓存范围更广
- 一级缓存:是SQLSession级别的缓存,缓存的数据只在SQLSession内有效。也就是说,同一个SQLSession中多次执行相同的查询会命中缓存,但不同的SQLSession之间不共享一级缓存。SQLSession关闭后,一级缓存即失效。
- 二级缓存:是Mapper级别的缓存,同一个namespace(命名空间)共用这一个缓存(但是可以精细到sql),所以对SQLSession是共享的。二级缓存需要手动开启和配置,其生命周期与SQLSession无关,多个SQLSession可以共享同一个Mapper的二级缓存。
数据共享性更高
- 一级缓存由于是基于SQLSession的,因此其生命周期相对较短,不便于在多个会话间共享数据。
- 二级缓存是跨会话的,可以在不同的会话中共享缓存数据,减少了数据库交互次数,进一步提高了数据访问效率。
可控性更强
- 一级缓存是自动管理的,无需开发者手动清理或管理。当SqlSession关闭或提交事务时,其缓存会被清空,以保证数据的实时性和一致性。但这也导致一级缓存的灵活性相对较低。
- 二级缓存的可控性更强。开发者可以通过配置缓存的刷新策略(如LRU、FIFO等缓存回收策略,以及缓存刷新间隔时间等)、大小、存储介质等参数,来确保缓存数据的及时更新和有效利用。
适用场景更多
- 一级缓存非常适用于在同一个SQLSession中执行多次相同查询的场景。
- 二级缓存则更适用于跨事务、频繁访问相同数据的场景。例如,在一个web应用中,用户多次访问同样的数据,二级缓存可以避免每次请求都去数据库查询,从而提升系统性能。此外,对于查询频率高且数据不经常变动的场景,以及多个会话需要共享相同数据的场景,二级缓存也能发挥显著作用。
然而,也需要注意到二级缓存的一些潜在问题。例如,由于二级缓存是存放在内存中的,如果缓存数据量较大,会占用大量的内存,可能影响系统的稳定性。同时,由于数据的共享性,也可能导致数据一致性的问题。因此,在使用二级缓存时,需要根据具体的业务需求和系统特点进行选择和配置,并合理设置缓存失效策略、序列化问题等,以充分利用缓存的优势并避免其潜在问题。
综上所述,MyBatis的二级缓存相较于一级缓存具备缓存范围更广、数据共享性更高、可控性更强以及适用场景更多等优势。然而,在使用时也需要注意其潜在问题,并根据实际情况进行合理配置和使用。

浙公网安备 33010602011771号