什么是缓存?
是数据交互的缓冲区,应用程序需要读取数据时,先从数据库将数据去除,放在缓冲区,应 用程序从缓冲区读取数据。
缓存的特点:数据库取出的数据保存在内存中,具备快速读取和使用。
缓存的限制:读取时无需再从数据库获取,数据可能不是最新的。
缓存的功能:减少java Application 与数据库的交互次数,从而提升程序的运行效率。
缓存的适用性:经常查询并且不经常改变的,数据的正确与否对最终结果影响不大的。
缓存的分类:
一级缓存:会话级别的缓存,针对一次会话 *** 作;
二级缓存:映射器级别的缓存,针对不同Namespace的映射器;
自定义缓存:根据各类不同缓存机制,自定义缓存实现方式。
一级缓存:
打印:
注意:调用sqlsession的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。
缓存的配置:
localCacheScope:表示配置一级缓存,默认是session级别的缓存。
一级缓存的工作流程:
1.对于某个Select Statement,根据该Statement 生成key;
2.判断在Local Cache中,该key是否用对应的数据库存在;
3.如果命中,则跳过查询数据库,继续往下走;
4.如果没命中,去数据库查询数据,得到查询结果;
5.将key和查询到的结果作为key和value,放入Local Cache中;
6.将查询结果返回;
7.判断缓存级别是否为STATEMENT级别,如果是的话,清空本地缓存;
一级缓存失效情况:
不同SqlSession对应不同的一级缓存
同一个SqlSession单查询条件不同
同一个SqlSession两次查询期间执行了任何一次增删改 *** 作
同一个SqlSession两次查询期间手动清空了缓存
二级缓存:
缓存的配置
1.在 mybatis的xml配置
2.在Mapper.xml中配置
3.在使用 *** 作中配置
注解配置:
在接口的定义上面直接使用@CacheNamespace 并将blocking设置为true,二级缓存就可以使用了
小结:
A:Mybatis的二级缓存相对于一级缓存,实现了缓存数据的共享,可控性也更强
B:二级缓存极大可能会出现错误数据,有设计上的缺陷,安全使用条件比较苛刻
C:二级缓存分布式环境下,必然会出现读取到错误数据,所以不推荐使用
总结:
一级缓存:是相对同一个SqlSession对象而言的缓存
二级缓存:一个namespace下的所有 *** 作语句,都影响者同一个Cache
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)