【Mybatis框架】查询缓存(一级缓存)
做Java的各位程序员们,估计SSH和SSM是我们的基础必备框架。也就是说我们都已经至少接触过了这两套常见的集成框架。当我们用SSH的时候,相信很多人都接触过hibernate的两级缓存,同样,相对应的,Mybatis也存在着两级缓存。接下来,我们就来介绍一下Mybatis的一、二级缓存。
首先我们要知道什么是查询缓存?查询缓存又有什么作用?
功能:mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。
用图来表示如下图:
粗略的解释一下就是:
一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。所以在这种情况下,是不能实现跨表的session共享的 二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是横跨跨SqlSession的。相信不用我再给大家去解释什么事Mapper了吧!
那我们就先说一下Mybatis的一级缓存
画一个简单的图吧:
这个图好像有点显眼啊,就这样吧先。
首先从图上,我们可以看出,一级缓存区域是根据SqlSession为单位划分的。每次查询都会先从缓存区与找,如果找不到就会从数据库查询数据,然后将查询到的数据写入一级缓存中。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+sql语句。而value值就是从查询出来映射生成的java对象。而为了保证缓存里面的数据肯定是准确数据避免脏读,每次我们进行数据修改后(增删改)就会执行commit操作,清空缓存区域。
说到这里,我们来做一下测试:
- //获取session
- SqlSession session = sqlSessionFactory.openSession();
- //获限mapper接口实例
- UserMapper userMapper = session.getMapper(UserMapper.class);
- //第一次查询
- User user1 = userMapper.findUserById(1);
- System.out.println(user1);
- //第二次查询,由于是同一个session则不再向数据发出语句直接从缓存取出
- User user2 = userMapper.findUserById(1);
- System.out.println(user2);
- //关闭session
- session.close();
结果图:
而当我们提交Commit之后呢?
- //获取session
- SqlSession session = sqlSessionFactory.openSession();
- //获限mapper接口实例
- UserMapper userMapper = session.getMapper(UserMapper.class);
- //第一次查询
- User user1 = userMapper.findUserById(1);
- System.out.println(user1);
- //在同一个session执行更新
- User user_update = new User();
- user_update.setId(1);
- user_update.setUsername("张三");
- userMapper.updateUser(user_update);
- session.commit();
- //第二次查询,虽然是同一个session但是由于执行了更新操作session的缓存被清空,这里重新发出sql操作
- User user2 = userMapper.findUserById(1);
- System.out.println(user2);
效果图
由此可见,Mybatis的一级缓存是存在与SqlSession中,可以提高我们的查询性能,但是不能实现多sql的session的共享。
【Mybatis框架】查询缓存(一级缓存)的更多相关文章
- MyBatis框架——动态SQL、缓存机制、逆向工程
MyBatis框架--动态SQL.缓存机制.逆向工程 一.Dynamic SQL 为什么需要动态SQL?有时候需要根据实际传入的参数来动态的拼接SQL语句.最常用的就是:where和if标签 1.参考 ...
- mybatis的延迟加载、一级缓存、二级缓存
mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...
- Mybatis的缓存——一级缓存和源码分析
目录 什么是缓存? 一级缓存 测试一. 测试二. 总结: 一级缓存源码分析: 1. 一级缓存到底是什么? 得出结论: 2. 一级缓存什么时候被创建? 3. 一级缓存的执行流程 结论: 一级缓存源码分析 ...
- mybatis框架-查询用户表中的记录数
之前已经搭建过mybatis框架了,现在我们要用mybatis框架真正的干点事情了. 这是这个简单web项目的整体架构. 我们使用mybatis框架查询用户表中的记录数: 这是用户类: package ...
- MyBatis原理-延迟加载,一级缓存,二级缓存设置
一.延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息. ...
- 在Hibernate框架中详谈一级缓存
在学习Hibernate的过程中我们肯定会碰上一个名词---缓存,一直都听说缓存机制是Hibernate中的一个难点,它分为好几种,有一级缓存,二级缓存和查询缓存 今天呢,我就跟大家分享分享我所理解的 ...
- hibernate框架学习之一级缓存
l缓存是存储数据的临时空间,减少从数据库中查询数据的次数 lHibernate中提供有两种缓存机制 •一级缓存(Hibernate自身携带) •二级缓存(使用外部技术) lHibernate的一级缓存 ...
- JavaWeb_(Hibernate框架)Hibernate中一级缓存
Hibernate中一级缓存 Hibernate 中的缓存分为一级缓存和二级缓存,这两个级别的缓存都位于持久化层,并且存储的都是数据库数据的备份.其中一级缓存是 Hibernate 的内置缓存,在前面 ...
- java-mybaits-00601-查询缓存-一级缓存、二级缓存
1.什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存. 在操作数据库时需要构造 sql ...
- java:Mybatis框架3(二级缓存,延时和积极加载,SSI(Ibatis)集成,SSM集成)
1.二级缓存: 需要导入二级缓存jar包: mybatis03: ehcache.xml: <ehcache xmlns:xsi="http://www.w3.org/2001/XML ...
随机推荐
- NSOprationQueue 与 GCD 的区别与选用
原文链接:http://www.jianshu.com/p/d09e2638eb27 GCD 技术是一个轻量的,底层实现隐藏的神奇技术,我们能够通过GCD和block轻松实现多线程编程,有时候,GCD ...
- Win7普通版-X86-SP1-ios-旗舰版安装
------------------------------- 自己的电脑是X64Win7系统.Acer电脑----->>现在改装成 Win7普通版-X86-SP1-ios-旗舰版安装 ...
- ecshop 多表删除
$sql = 'DELETE O, G FROM ' . $GLOBALS['ecs']->table('delivery_order') . ' AS O, ' . $GLOBALS['ecs ...
- WordPress数据库优化技巧
各位站长都知道wordpress用久了就会越来越慢.今天就给大家介绍如何给自己的wordpress提速,分两种方法:1.插件属性wordpress的都知道其插件是相当的多,只要你能想得到的基本都有,在 ...
- 解决COM组件80070005错误
前段时间在维护公司以前的项目时遇到一个问题,客户需要添加一个word文档合并功能,按理说这功能比较好实现,只要调用Office自带的COM组件就搞定了,但实际上并非如此,在客户端部署上以后运行报错,提 ...
- MySQL 调优/优化的 100 个建议
MySQL 调优/优化的 100 个建议 MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供 101 条优化 MySQL 的建议.有些技巧适合特定 ...
- 关于学习JavaScript 的 高三编程 一些心得
面对JS 问题来说,很多的细节问题以及 弱类型转换的问题,往往会成为学习js 路上的一个阻碍. 那么问题来了,今天我看到的是 高三 里面的 基本概念的 语法问题. 直奔主题.(还是帖代码先) sw ...
- 如何在网页中添加“QQ交流”
今天在撸码时,想到这个问题,有些网页中会有诸如,那么如何在网页添加"QQ交谈"? 第一步.登录QQ: 第二步.打开网页:QQ推广,启用QQ通讯组件: 第三步.选择组件样式,设置提示 ...
- 开始学红帽的RHCE课堂有2次课了,要记下自己的学习经历
我终于申请成功了博客园的博客了. 红帽课堂已经开始2次了,这里的记录可能不分顺序,每天记录一点自己的学习内容.方便自己以后查询. 已经学了以下内容: 1.访问命令行 使用桌面的访问命令 GNOME 3 ...
- Daily Scrum Meeting ——FirstDay
一.Daily Scrum Meeting照片 二.Burndown Chart 三.项目进展 1.介绍在github上发布的issues 根据MVC三层模型,我们主要发布的是V层以及M层,C层将根据 ...