为了减轻数据压力,提高数据库的性能,我们往往会需要使用缓存。MyBatis为我们提供了一级缓存和二级缓存。

  (1)一级缓存是SqlSession级别的缓存,在操作数据库的时候需要创建一个SqlSession,其中有一个HashMap,用于存储缓存数据。不同的SqlSession之间,其缓存数据的HashMap是不同的;

  (2)二级缓存是Mapper级别的缓存,多个SqlSession去操作同一个Mapper中的SQL语句,则这些SqlSession可以共享二级缓存,即二级缓存是跨SqlSession的。

  MyBatis的一级缓存和二级缓存的结构如下图所示:

1、一级缓存

  我们通过一个例子来理解一级缓存,如下图所示:
  (1)当我们第一次查询ID为1的用户信息时,先去缓存中查找缓存中是否缓存有ID为1的用户信息,发现没有,则去数据库中查询,并将查询结果存储到缓存中;
  (2)第二次查询ID为1的用户信息时,去缓存中查找,发现有缓存的数据,因此从缓存中直接取出数据使用;
  (3)如果对数据库中的数据进行了修改、添加或删除操作并执行了commit之后,会清空一级缓存中的数据(这样做的目的是为了让缓存中存储的永远是最新的数据,避免脏读);
  (4)当我们第三次查询ID为1的用户时,先去缓存中查找,如果有则取出来直接用,如果没有则从数据库中查询,然后重新缓存到缓存中。
  MyBatis默认支持一级缓存,不需要在配置文件中进行配置。

2、二级缓存

  二级缓存的原理与一级缓存的原理相似,都是有则取出来直接使用,无则从数据库中查询出来后存储到缓存中,如果中途进行了commit操作则清空缓存。其基本流程如下图所示:
  MyBatis中的二级缓存默认是关闭的,如果我们想要使用二级缓存,则需要对其进行配置:
  (1)在SqlMapConfig.xml文件中配置二级缓存的总开关,代码如下:
<settings>
<!-- 开启二级缓存(默认是开的,这里写出来是为了方便代码维护) -->
<setting name="cacheEnabled" value="true" />
</settings>

  (2)在XXXMapper.xml文件中开启二级缓存,代码如下:

<!-- 开启本mapper所在namespace的二级缓存 -->
<cache />

  (3)如果想要对某个POJO中的数据进行二级缓存,则需要将其序列化:让这个POJO类实现Serializable接口(这样做的原因是因为二级缓存的数据存储介质是多种多样的,不一定只在内存中,也可能在硬盘中,甚至是远程传输,因此我们将其序列化,以便将来对其进行反序列化)。

  通过以上三个步骤的操作,我们就完成了二级缓存的配置,在XXXMapper这个Mapper中的所有数据就都绑定了二级缓存机制。
  如果我们的某个SQL语句不需要进行二级缓存,但这个SQL所在的Mapper已经配置了二级缓存,那么我们只需要在这个statement上设置useCache属性为false,就可以关闭这个SQL语句的二级缓存,代码如下:
<select id="selectOrderUserType" resultType="bean_order_user_type" useCache="false">

  当然,MyBatis之所以默认不开启二级缓存,是因为二级缓存有一定的局限性。试想,一个数据表中存储着上亿条数据,如果我们开启了二级缓存,那么这上亿条数据就都存储到了二级缓存中,现在如果我们对其中的一条数据进行了修改并commit提交,那么这上亿条数据就被清空出缓存了,即有时候使用二级缓存的命中率极低。这种情况也是有解决方案的,就是使用一些比较优秀的缓存框架,或使用三级缓存。

 

【JAVA - SSM】之MyBatis查询缓存的更多相关文章

  1. Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——My ...

  2. apache ignite系列(九):使用ddl和dml脚本初始化ignite并使用mybatis查询缓存

    博客又断了一段时间,本篇将记录一下基于ignite对jdbc支持的特性在实际使用过程中的使用. 使用ddl和dml脚本初始化ignite 由于spring-boot中支持通过spring.dataso ...

  3. Mybatis学习记录(七)----Mybatis查询缓存

    1. 什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 sql ...

  4. 八 mybatis查询缓存(一级缓存,二级缓存)和ehcache整合

    1       查询缓存 1.1     什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存.

  5. mybatis查询缓存——(十三)

    1.     mybatis缓存介绍 如下图,是mybatis一级缓存和二级缓存的区别图解: mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存.

  6. (十二)mybatis 查询缓存

    目录 什么是查询缓存 图解查询缓存 一级缓存 二级缓存 禁用二级缓存 刷新缓存 二级缓存应用场景 二级缓存局限性 什么是查询缓存 mybatis 在查询数据的时候,会将数据存储起来,下次再次查询相同的 ...

  7. mybatis查询缓存

    一级缓存针对每个sqlSession进行缓存,sqlSession销毁,一级缓存就不存在. ,使用Map存储了sql执行查询结果集(java对象) 二级缓存针对每个map的namespace进行缓存. ...

  8. mybatis 查询缓存问题

    <settings> <setting name="localCacheScope" value="STATEMENT" /> < ...

  9. SSM(五)Mybatis配置缓存

    1.在没有配置的情况下,mybatis默认开启一级缓存. Object object=mapper.getXxx(object); Object object2=mapper.getXxx(objec ...

随机推荐

  1. URAL 1119. Metro(BFS)

    点我看题目 题意  : 这个人在左下角,地铁在右上角,由很多格子组成的地图,每一条边都是一条路,每一条边都是100米.还有的可以走对角线,问你从起点到终点最短是多少. 思路 : 其实我想说一下,,,, ...

  2. 《ArcGIS Engine+C#实例开发教程》第二讲 菜单的添加及其实现

    原文:<ArcGIS Engine+C#实例开发教程>第二讲 菜单的添加及其实现 摘要:在上一讲中,我们实现了应用程序基本框架,其中有个小错误,在此先跟大家说明下.在“属性”选项卡中,我们 ...

  3. 转:理解 Linux 的硬链接与软链接

    Linux 的文件与目录 现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程 创建信息的逻辑单元可被多个进程并发使用.在 UNIX 系统中,操作系统为磁盘上的文本与图像.鼠标与键 ...

  4. 关于JQuery与AJAX验证

    AJAX验证,其实就是JS代码,他就是先利用Jquery或JS获取一个值,然后偷偷的把值传送到验证界面,然后在偷偷的把验证后的结果给传回来,利用传回来的结果在进行JS判断,从而不会刷新界面. 用图片解 ...

  5. 【JavaScript 开发规范】

    Javascript 最佳实践http://sofish.de/1171http://sofish.de/1181 总是使用 ‘var’ √ 特性检测而非浏览器检测 √ 使用方括号记法 √ 使用&qu ...

  6. SharePoint 2010 部署 WSP 包

    转:http://www.cnblogs.com/myheaven/archive/2011/05/19/2051180.html .net在工程的下面生成了WSP包,在Debug下面.需要放到生产环 ...

  7. (转载)SQL Server 2005 日志文件过大处理

    由于安装的时候没有计划好空间,默认装在系统盘,而且又没有做自动备份.截断事务日志等,很快LDF文件就达到十几G,或者几十G ,此时就不得不处理了. 备份和计划就不说了,现在就说下怎么把它先删除吧: 1 ...

  8. Java之 AtomicInteger

    AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicIn ...

  9. ArcGIS for Android示例解析之空间查询-----QueryTask

    转自:http://blog.csdn.net/wozaifeiyang0/article/details/7331450 QueryTask 查询功能在GIS中是一个不可或缺的重要功能,示例中提供了 ...

  10. (转载)PHP的内存限制 Allowed memory size of 134217728 bytes exhausted (tried to allocate 1099 bytes) in

    (转载)http://blog.csdn.net/beyondlpf/article/details/7794028 Fatal error: Allowed memory size of 13421 ...