一、缓存
在聊二级缓存之前先让大家了解了解缓存是个什么东西吧,缓存就是用来提高查询访问速度,就是将每次的访问记录缓存在一地方,在下次进行查询时首先访问的不是数据库,而是缓存,如果在缓存中查询到了该次查询条件的结果集就直接返回结果,不再访问数据库。这样就对数据库的操作次数上就减少了很多,从而提高访问速度。当然,在查询缓存的机制中有两种不同的作用域(生命周期),分别问一级查询与二级查询缓存。
二、一级查询缓存
MyBatis的一级查询缓存是由 org.apache.ibatis.cache.impl.PerpetualCache 类的 HashMap本地缓存实现的,它的作用域则是SqlSession,它的作用域也就是生命周期,假如同一个SqlSession中执行两次sql语句的查询,这两次的查询的位置是不同的,第一次查询时,由于没有缓存结果则是从数据库中进行查询结果,得到结果后写入缓存并将结果返回给查询语句,而在进行第二次查询时,这时缓存中已经有符合条件的结果集,这次的查询就会在缓存获得结果并返回,而不会向数据库进行查询。当SqlSession结束后相应的缓存也就销毁了。
ps:myBatis默认一级查询时开启状态,而且不能关闭
三、二级查询缓存
二级缓存与一级缓存不同在于它更强大一些,强大在它的生命周期比一级缓存长,二级缓存的生命周期是与整个应用同步的,与应用同生共死,这个时候二级缓存就与SqlSession没有关系了。这是从它们两者的生命周期上来讲,除此之外它俩的用途目的也不一样,一级缓存是用来共享数据提升速度和效率的,而二级缓存则是为了延长查询结果的保存时间,从而提高系统性能而已,二级缓存也是可以用于共享数据的。
二级缓存在myBatis中有内置的,其实现类为 org.apache.ibatis.cache.impl.PerpetualCache,并且使用的时候实体类需要实现序列化接口,除了内置的之外还有一个ehcache,相对于内置的缓存来说这个是专业的,用起来也比较方便,相关架包在github上有开源的, https://github.com/mybatis/ehcache-cache/releases
四、缓存的使用
我觉得一级缓存一般用在对数据库的查询时才会用的比较多一点,而相对于二级缓存来说,在进行数据库的操作时增删改的操作相对较少而查询频繁时才会使用,任何增删改的操作都会刷新二级缓存,这样就大大降低了系统的性能,反而适得其反,但二级缓存也有缺陷,我也从大佬博客上看到的:
mybatis二级缓存对细粒度的数据级别的缓存实现不好。
比如如下需求:对商品信息进行缓存,由于商品信息查询访问量大,但是要求用户每次都能查询最新的商品信息,此时如果使用mybatis的二级缓存就无法实现当一个商品变化时只刷新该商品的缓存信息而不刷新其它商品的信息,因为mybaits的二级缓存区域以mapper为单位划分,当一个商品信息变化会将所有商品信息的缓存数据全部清空。解决此类问题需要在业务层根据需求对数据有针对性缓存。
具体详细内容看查看大佬博客https://blog.youkuaiyun.com/gg12365gg/article/details/52048266
或者深入了解https://blog.youkuaiyun.com/isea533/article/details/44566257