Mybatis的一级缓存:
mybatis会在表示会话的sqlsession对象中建立一个简单的缓存,将每次查询到的结果缓存起来(缓存到内存中),当在同一个sqlSession执行相同的sql查询语句会从缓存中获取数据,不再去数据库查询,从而提高查询效率。
需要注意的是:如果sqlsession执行了DML(增删改)操作并且提交到数据库时,Mybatis则会清空sqlsession里的一级缓存,这样做的目的是为了保证缓存中是当前最新的数据,避免出现脏读现象。
当一个sqlsession结束的时候该sqlsession中的一级缓存也就不存在了,Mybatis默认开启一级缓存不需任何配置。
缓存机制:
MyBatis的缓存机制是基于id进行缓存的,也就是说,MyBatis使用HashMap缓存数据时,是使用对象的id作为key,对象作为vaue保存的.
Mybatis的二级缓存:
二级缓存是mapper级别的缓存,多个sqlsession去操作同一个mapper的
sql语句,多个sqlsession去操作数据库得到的数据存在二级缓存区域,多个sqlsession可以共用二级缓存,二级缓存是跨sqlsession的。
二级缓存是多个sqlsession共享的,其作用域是mapper的同一个namespace,不同的sqlsession执行同一个namespace下的sql语句且向sql中传递的参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询到的数据写到缓存,第二次会从缓存中获取数据,将不再从数据库查询,从而提高查询效率,Mybatis默认没有开启二级缓存,需要在setting全局中配置开启二级缓存(在MyBatis配置文件(mybatis-config.xml)中开启二级缓存)。
如果有缓存就不再从数据库中获取,大大提高了查询速度。
缓存机制(减轻数据库的访问压力),基于mybatis的二级缓存机制,在实例没有进行集群处理时可以使用Map来进行数据的缓存,当服务进行集群处理时,我们就要用第三方缓存(Rides),来进行数据的缓存。
1、在yml中配置 cache.enabled:true
2、在mapper.xml中配置 cache-ref标签 并且在要缓存的类上面添注解@CacheNamespace(implementation = MybatisRedisCache.class , flushInterval = 3000l , eviction = LruCache.class)
3、实现cach接口(mybatis缓存规范)中的put 与 get 方法