码迷,mamicode.com
首页 > 其他好文 > 详细

Mybatis一级缓存和二级缓存总结

时间:2019-12-04 22:09:12      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:support   nfa   tis   tail   数据库   nbsp   订单   技术   mil   

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。
 

Mybatis一级缓存和二级缓存总结

标签:support   nfa   tis   tail   数据库   nbsp   订单   技术   mil   

原文地址:https://www.cnblogs.com/jelly12345/p/11985647.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!