Mybatis一级缓存和二级缓存总结
1:mybatis一级缓存:级别是session级别的,如果是同一个线程,同一个session,同一个查询条件,则只会查询数据库一次
2:mybatis二级缓存:级别是sessionfactory级别的,是针对于各个线程发出的sql查询条件
3:spring 关闭了mybatis的一级缓存,每一次查询都会建立一次连接,创建新的session,源码类有:
MapperFactoryBean、SqlSessionDaoSupport、SqlSessionTemplate;在SqlSessionTemplate中invoke方法中,有提交,关闭连接等方法invoke方法是增强方法,实现原理也是动态代理4:spring集成mybatis的二级缓存中,有很多的坑:总结如下
对于查询多commit少且用户对查询结果实时性要求不高,此时采用mybatis二级缓存技术降低数据库访问量,提高访问速度。
但不能滥用二级缓存,二级缓存也有很多弊端,从MyBatis默认二级缓存是关闭的就可以看出来。
二级缓存是建立在同一个namespace下的,如果对表的操作查询可能有多个namespace,那么得到的数据就是错误的。
举个简单的例子:
订单和订单详情,orderMapper、orderDetailMapper。在查询订单详情时我们需要把订单信息也查询出来,那么这个订单详情的信息被二级缓存在orderDetailMapper的namespace中,这个时候有人要修改订单的基本信息,那就是在orderMapper的namespace下修改,他是不会影响到orderDetailMapper的缓存的,那么你再次查找订单详情时,拿到的是缓存的数据,这个数据其实已经是过时的。
根据以上,想要使用二级缓存时需要想好两个问题:
1)对该表的操作与查询都在同一个namespace下,其他的namespace如果有操作,就会发生数据的脏读。
2)对关联表的查询,关联的所有表的操作都必须在同一个namespace。
相关推荐
dongxurr 2020-07-26
无情的你无情的雨 2020-07-18
jimgreatly 2020-06-03
cnflat0 2020-04-25
微微撒 2020-04-18
技术驱动人生 2020-04-08
Justagreenonion 2020-03-27
zhiyuan0 2020-02-24
云之飞踢 2020-01-28
gwn00 2020-01-14
明月清风精进不止 2020-01-07
Justagreenonion 2020-01-05
manbucy 2014-05-20
javamagicsun 2019-12-17
栖梧桐 2019-12-13
GechangLiu 2016-11-23
flydoging 2019-11-05
Ashes 2019-11-05
dongxurr 2019-11-04