mybatis的2种缓存机制:二级缓存(mapper级别)

在实际开发中,为了提高数据库的查询速度,我们会用到缓存,而mybatis本身也提供了2种缓存机制来查询缓存来缓存数据,从而达到提高查询性能。mybatis的2中缓存机制分别为一级缓存(SqlSession级别的缓存),二级缓存(mapper级别的缓存,是多个SqlSession共享的)。mybatis主要是通过缓存机制减轻数据压力,来达到提高数据库性能的目的。


注:mybatis的缓存机制是基于id进行缓存的。



现在聊聊二级缓存(mapper级别,mybatis默认不开启二级缓存):

二级缓存是

多个SqlSession共享的,其 作用域是在mapper的痛一个namespace。使用二级缓存时,多个SqlSession是使用同一个mapper去操作数据库的,得到的数据会存在二级缓存区域,它同样是用 HashMap来进行数据存储的,跟一级缓存相比,二级缓存作用域范围更大,多个SqlSession是共用二级缓存的,二级缓存是跨SqlSession的。


注:mybatis使用HashMap缓存数据时,是使用对象的id作为key,而对象作为value保存的。


不同的SqlSession执行相同的sql语句,传的参数也相同,那第一个SqlSession是去底层数据库查询数据的,会把查询到的数据写到缓存(内存)中,之后其他SqlSession再执行相同的sql就直接去二级缓存区域获取数据,不再去底层数据库查询数据,这样提高了查询效率。


How:怎么开启二级缓存呢?

在实际项目开发中,如果用到mybatis的二级缓存,要在mybatis.xml的配置文件中添加settings。

<settings>
   <!--开启二级缓存-->
   <setting name="cacheEnable" value="true"></setting>
</settings>

还要在相应的mapper.xml中开启二级缓存

<!--开启当前mapper.xml的namespace的二级缓存-->
<cache eviction="LRU" flushInterval="60000"size="512" readOnly="true"></cache>

cache是用来开启当前mapper的二级缓存的。

注:使用二级缓存时,与查询结果映射的java对象(实体类)必须实现java.io.Serializable接口的序列化和反序列化操作,如存在父类,其子类成员都要实现序列化接口。

Why:为什么一定要实现序列化接口?

因为二级缓存数据存储介质多种多样,不一定要在内存,可以是硬盘或者远程服务器,而实现序列化接口可以让我们对缓存数据进行序列化操作和反序列化操作。

我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。