mybatis一级缓存存在的意义?

mybatis的一级缓存是sqlsession级别的,也就是说一次会话查询后就关闭了(当然一次会话查询了可能有多个sql查询),似乎缓存派不上用场,那么一级缓存存在的意义是什么?

阅读 5.8k
1 个回答

首先,我的回答只针对于mybatis3.2.3这个古老版本。由于个人原因,其他新版的mybatis还没有仔细看过。

1,一级缓存没有涉及粒度控制。它的缓存策略和战争时期的无差别轰炸一样没有任何目的性。假设您有一张雇员表有50W条数据。如果黑客将系统中所有的用户ID都查一遍。就意味着您的一级缓存会给你带来不可想象的惊喜。
2,在当前sql会话中仅仅使用了一个Map来存储所有sql映射的相关查询及CacheKey。
3,任何update类型(曾,删,改)的操作在清除缓存时,相当于直接置空了当前sqlSession的Map
4, 即使置空了当前会话,那也不能保证其他sqlSession不存在过期的数据。(往往我们的应用容器中会创建多个会话来保持数据库的加粗文字并发访问能力)
5, 即使你的业务场景并不关心上述4项问题,它(一级缓存)也只能用于单节点容器。原因就是:一级缓存相当于程序内的一个非常...非常...非常...简单的Map结构。
6,如上所说,一级缓存并不能适应分布式应用。最过于蛋疼的就是,一级缓存只有容器发送了update类型(曾,删,改)的操作时,才会进行缓存清除。在此,给您举个极端场景的栗子--->如果一个容器(仅查询当天新闻信息),没有任何update类型的操作。那么...由于缓存不更新,将会产生重大生产事故。
7,最总要的是,如果我们对一级缓存进行定制化开发,以求解决上面的六个问题。将会付出比较大的资金成本......而且,二级缓存的机制正好完美解决了以上的六个问题。

综上所得:

    1,二级缓存完全可以代替一级缓存。
     (我们只要关闭一级缓存,然后打开二级缓存即可。实际上大部分Mybatis的版本中,二级缓存默认就是打开状态)
    2,个人认为,mybatis的一级缓存甚至都比不上食之无味,弃之可惜的鸡肋。
    3,反正嘛,人家mybatis宣称有一级缓存这么一个功能。我们学习或者面试的时候,就给他们个面子就说有这么个玩意儿。
实际上,一级缓存这个功能点给人的感觉就是...................重在参与!!!!!
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进