mybatis查询缓存
查询缓存
为什么要缓存
如果缓存(内存)中有数据,就不需要从数据库中去查询了,而是直接从内存中拿,大大提供系统性能。
查询商品ID为1000的商品
第一次查询时候,去数据库拿,写到内存中、并且返回
第2、3次,直接内存读,然后返回
什么是查询缓存
Mybatis提供查询,用于减轻数据库的压力,提供数据库的性能。
Mybatis提供一级缓存、和二级缓存
一级缓存是SQLSession级别的缓存,在操作数据库是需要构建SQLSession对象,在对象有有一个数据接口(hashMap)用于存储缓存数据,不同的SQLSession之间缓存数据区域(hashMap)是互补影响。
二级缓存是Mapper基本的缓存,多个SQLSession去操作同一个Mapper的SQL语句,多个SQLSession可以共用二级缓存,二级缓存是跨SQLSession的。
一级缓存
原理
实践
第一次发起查询用户id为1的用户信息,先去找缓冲中是否有id为1的用户信息,如果没有,从数据库中查询用户,
得到用户信息,将用户信息存储到一级缓存中。
如果SQLSession执行了commit操作(插入、更新、删除),情况SQLSession中的一级缓存,这样做的目的:为了让缓存存储最新的数据,避免脏读。
第二次发起查询用户id为1的用户信息,先去找缓冲中是否有id为1的用户信息,如果有,直接从缓存中获取用户信息。
Mybatis默认支持一级缓存的,不要额外去配置
二级缓存(了解)
Mybatis二级缓存细粒度的数据级别的缓存实现不好。比如,对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次查询都能查询到最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当有一个商品变化时只刷新该商品的缓存,而不是全部商品信息。
因为mybatis的二级缓存区域以Mapper为单位划分的,当有一个商品信息变化,会将所有的商品信息的缓存全部清空。解决此类问题,在业务层根据需求对数据有针对性的缓存。
使用内存数据库来做缓存
Redis、memcache