mybatis一级缓存和二级缓存使用详解

1. Mybatis一级缓存详解

Mybatis的一级缓存是sqlSession级别的缓存,默认开启,可以开启或关闭。一级缓存是指在同一个sqlSession中执行相同的sql语句,第二次执行能够直接从缓存中获取,而不必再次向数据库发送sql。

Mybatis一级缓存底层是基于PerpetualCache这个类实现的,它实现了一个永久存储的缓存系统。PerpetualCache继承了BaseCache抽象类,BaseCache定义了缓存的基本操作,例如putObject、getObject等方法。其中缓存的key是sqlId+Offset+limit+SQL,缓存的value是查询结果。

当一个sqlSession执行新增、修改、删除操作时,会自动清空该sqlSession的一级缓存,这是因为新增、修改、删除操作可能会使得缓存数据变得不一致或者无效。

1.1 一级缓存命中条件

Mybatis一级缓存的具体规则如下:

Session级别,同一个Session的同一个查询只会发送一次sql

Mapper.xml文件中namespace + id + SQL参数确定唯一查询

SQL语句必须完全相同(sql语句中的空格和换行并不影响缓存,但是缓存的sql语句一定要和查询时的一模一样)

SQL参数必须完全相同

返回结果集的数量、元素顺序、元素的类型也必须完全相同

只要以上条件都满足,就可以命中一级缓存。

1.2 一级缓存失效机制

在以上条件有变动的时候,一级缓存失效:

sqlSession不同:Mybatis一级缓存作用域是同一个sqlSession,如果使用多个sqlSession,一级缓存也失效

缓存存储内容不同:相同的查询语句,如果不同的sqlSession进行插入、修改、删除等更新操作,则会导致缓存失效

1.3 一级缓存优缺点

一级缓存的优点:

效率高。由于是基于内存实现缓存,所以访问速度非常快

存取数据效率高。缓存直接在内存中获取数据,避免了磁盘IO的开销

节约数据库查询资源

一级缓存的缺点:

缓存只能在本次会话中被访问,多个会话之间的数据互相不可见

缓存中的数据没有定时失效策略

容易导致脏数据,如果缓存中的数据被更新,但修改后的数据并没有刷新到缓存中,查询的结果可能是不正确的数据。解决该类问题的方法是清除缓存或使用二级缓存

2. Mybatis二级缓存详解

Mybatis的二级缓存是mapper级别的缓存,可以通过在Mapper.xml文件中设置cache来开启或关闭,是基于缓存框架的实现,可以跨越SqlSession访问。二级缓存底层还是基于PerpetualCache实现。

在同一个Mapper文件的namespace中,如果缓存查询的结果相同,则等同于是从缓存中获取数据,而不需要再去查询数据库。同时,二级缓存是跨sqlSession的,即在两个不同的sqlSession中去操作相同的namespace相同的查询语句,第二次执行查询时,如果查询结果已经被缓存,则直接从缓存中获取数据,而不会再次访问数据库。

2.1 二级缓存的使用

要开启二级缓存,首先需要在Mapper.xml中添加cache声明:

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true">

</cache>

cache元素中常用的属性有:

eviction:缓存策略 FIFO、LRU、SOFT、WEAK

flushInterval:刷新间隔,单位毫秒,默认不刷新

size:缓存大小(对象数或元素数),默认为1024个对象

readOnly:缓存是否只读,默认false,表示缓存可读写

其中,eviction属性指定了缓存的删除策略,常用的策略有FIFO、LRU、SOFT和WEAK。FIFO(先进先出)策略指定的缓存中添加项按照它们的插入顺序被移除。而LRU(最近最少使用)策略则尝试移除最近最少使用的对象。SOFT缓存是为了装载那些比较大的、昂贵的、但又常用的对象。当内存空间不足时,缓存处理程序将试图释放内存,但是如果释放他们会破坏应用程序的内存空间,SOFT策略将把对象保留在内存中。

2.2 二级缓存失效机制

二级缓存失效机制分为两种:先清空缓存,再操作数据库及直接操作缓存。

先清空缓存,再操作数据库:在Mybatis中,只要执行更新操作(insert、delete、update)时就会清空该Mapper所在的二级缓存。这样就避免了脏数据的产生,保证了数据的一致性

直接操作缓存:缓存数据的处理方式取决于缓存管理器(CacheManager),因为不同的CacheManager的实现是不同的。如果使用Ehcache作为二级缓存实现,则提供了各种写策略,我们可以选择在过期或指定条件下,直接更新二级缓存

2.3 二级缓存优缺点

二级缓存的优点:

放置了查询过程中的重复查询,节约了查询性能

降低了数据库压力,节约了资源

可以被多个sqlSession共同使用,二级缓存是跨sqlSession的,当多个Session访问相同的Mapper的相同Sql时,它会从Mybatis的二级缓存中获取信息,而不是访问数据库

二级缓存的缺点:

占用内存空间:通常情况下,缓存会占用储存空间,如果数据集较大,会影响系统性能

数据不一致的问题:如果缓存中的数据和数据库的数据不一致,这样会产生脏数据,这时需要刷新缓存,或者在用户有操作时让这条记录失效,下次查询时直接访问数据源

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签