一级缓存:
一级缓存也称本地缓存,session级别的缓存,一级缓存是默认开启的,与数据库同一次的会话期间查询到的数据会放在本地缓存中,如果有需要获取相同的数据,则直接从缓存中取,就不会再次查询数据库。在日常的开发中,经常会有相同的sql执行多次的情况,mybatis就提供了一级缓存来优化这些查询,避免多次请求数据库,重点是它的作用域为一次sqlSession会话。
二级缓存:
二级缓存是全局缓存,是一个基于namespace级别的缓存,作用域更为广泛,不局限于一个sqlSession,可以在多个sqlSession之间共享,mybatis的二级缓存默认也是开启的,但是由于它的作用域是namespace,所以还需要在mapper.xml中开启才能生效,只需要加入cache标签即可。当要访问数据库形成一个会话查询一条数据时,这个数据就会被放在当前会话的一级缓存中,如果这个时候会话关闭了,那么以及缓存中的数据会被保存到二级缓存中,新的会话查询信息就会参照二级缓存,需要注意的是不同的namespaace会被防止到自己对应的缓存中去。
小结:
简单来说就是缓存首先一进来,就会先去二级缓存中查询,如果没有就去一级缓存中查找,一级缓存中没有的话,最后进入数据库中查找。作用顺序为二级缓存>一级缓存>数据库。需要注意的是,一级缓存作用域仅限于同一sqlSession中,无法感知到其他sqlSession中的数据变更,所以极易产生脏数据,而二级缓存可以通过cache-ref让多个mapper.xml共享一个namespace,从而实现缓存共享,但多表联动查询的时候会比较麻烦,由此,在生产环境的时候可以关闭一级缓存(statement级别),有需要的话可以打开二级缓存。如果是分布式应用的话, 这里我们不建议开启,具体原因大家可以了解一下哟~