mybatis一级缓存和二级缓存

333 阅读1分钟

一级缓存和二级缓存最大的区别就是作用域不一样,一级缓存是sqlSession,二级缓存是sqlSessionFactory.

  • 一级缓存:

基于PerpetualCacheHashMap 本地缓存。当一个sqlsession执行相同的(sql,参数一致)查询操作,第一次会去数据库中进行查找,找到后会存到一级缓存中,第二次会先到一级缓存中去查找,没有才会去查询数据库。mybatis是默认打开了一级缓存的。

当两个select语句中 有改的操作,则会清空一级缓存中的数据。手动调用sqlsession的clearcache方法也会将一级缓存清空。

  • 二级缓存

二级缓存并不是默认开启的,我们需要手动进行设置。

以上四点缺一不可。

二级缓存的作用域是sqlsessionfactory,说明即使是不同的sqlsession 但是如果这些不同的sqlsession是由同一个sqlsessionfactory创建出来的,那么这些sqlsession都可以共享这个二级缓存中的数据。

说下第三点。 什么时候会将数据写入到二级缓存中呢,首先开启一个sqlsession,改sqlsession首先将查询到的数据写入他自己的一级缓存中,此时并不会立马写入二级缓存。只有当该sqlsession关闭,也就是close的时候才会把该sqlsession中一级缓存的数据同步到二级缓存中。

两次查询之间如果有修改操作那么会造成 一级二级缓存都清空。

当一二级缓存都开启时,那么查找数据的顺序应该是,先二级缓存—–>一级缓存——>数据库。