mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。
mybatis 提供一级缓存和二级缓存
一级缓存是SqlSession级别的缓存, 在操作数据库时需要构造 sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。
二级缓存是mapper级别的缓存 ,多个SqlSession去操作同一个Mapper的sql语句 ,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
一级缓存应用,如果是执行两次service调用查询相同 的用户信息,不走一级缓存,因为session方法结束,sqlSession就关闭,一级缓存就清空。
为什么要用缓存,如果缓存中有数据就不要从数据库获取,大大提高性能。
mybatis提供了一个cache接口,如果要"实现自己的缓存逻辑",实现cache接口开发即可。
二级应用场景
对于访问多的查询请求且用户对查询结果实时性要求不高,此时可采用mybatis二级缓存技术降低数据库访问量,提高访问速度,业务场景比如:耗时较高的统计分析sql、电话账单查询sql等。
实现方法如下:通过设置刷新间隔时间,由mybatis每隔一段时间自动清空缓存,根据数据变化频率设置缓存刷新间隔flushInterval,比如设置为30分钟、60分钟、24小时等,根据需求而定。
二级缓存局限性
mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。