【MyBatis学习12】MyBatis中的一级缓存

  缓存的作用是减轻数据库的压力,提高数据库的性能的。mybatis中提供了一级缓存和二级缓存,先来看一下两个缓存的示意图:

  从图中可以看出:

  1. 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
  2. 二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

  这篇博文主要总结一下mybatis中的一级缓存,看一下一级缓存的工作原理:

  从图中可以看出:第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。得到用户信息,将用户信息存储到一级缓存中。

  如果中间sqlSession去执行commit操作(执行插入、更新、删除),则会清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。

  第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息。

  mybatis的一级缓存比较简单,我们不知不觉中就在用了,为了完整性,我写一个测试代码来测一下:

@Test
public void testCache1() throws Exception {
    SqlSession sqlSession = sqlSessionFactory.openSession();//创建代理对象
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    //下边查询使用一个SqlSession
    //第一次发起请求,查询id为1的用户
    User user1 = userMapper.findUserById(1);
    System.out.println(user1);

//      如果sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。

    //更新user1的信息
    user1.setUsername("测试用户22");
    userMapper.updateUser(user1);
    //执行commit操作去清空缓存
    sqlSession.commit();

    //第二次发起请求,查询id为1的用户
    User user2 = userMapper.findUserById(1);
    System.out.println(user2);

    sqlSession.close();

}

  一级缓存很简单,就不再赘述了,下一篇博文来总结一下mybatis的二级缓存。

  

  相关阅读:http://blog.csdn.net/column/details/smybatis.html

  学习笔记源码下载地址:https://github.com/eson15/MyBatis_Study



—–乐于分享,共同进步!

—–我的博客主页:http://blog.csdn.net/eson_15

时间: 2024-10-13 06:16:45

【MyBatis学习12】MyBatis中的一级缓存的相关文章

myBatis学习(9):一级缓存和二级缓存

正如大多数持久层框架一样,MyBatis同样提供了一级缓存和二级缓存的支持 1. MyBatis一级缓存基于PerpetualCache的HashMap本地缓存,其存储作用域为 Session,默认情况下,一级缓存是开启状态的.当 Session flush(); 或 close(); 之后,该Session中的所有 Cache 就将清空. 2.MyBatis二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Nam

Mybatis中的一级缓存和二级缓存

1.概述 mybatis提供查询缓存主要是为了减轻了数据库的压力,提高了系统的性能. 缓存分为一级缓存和二级缓存,他们之间的关系和区别如下: 一级缓存是sqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(hashmap)对象缓存数据.不同的sqlSession之间的数据缓存区域是不互相影响的. 二级缓存是mapper级别的缓存.多个sqlSession去操作同一个mapper中的sql语句,多个sqlSession共享同一个Mapper的二级缓

Mybatis学习记录(四)--高级查询和缓存

这些都是连贯的学习笔记,所以有的地方因为之前都说过,所以也就没怎么写详细了,看不太明白的可以看看之前的笔记. 一.高级查询 高级查询主要是一对一查询,一对多查询,多对多查询 1.一对一查询 有用户和订单两个表,用户对订单是1对1查询.也就是订单中有一个外键是指向用户的. 先创建实体类: User.java public class User { private int id; private String username; private String password; private St

Mybatis学习总结(九)——查询缓存

一.什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能.mybaits提供一级缓存和二级缓存. 1.一级缓存是sqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap),用于存储缓存数据.不同的sqlSession之间的缓存区域(HashMap)是互不影响的. 2.二级缓存是mapper级别的缓存,多个sqlSession去操作同一个Mapper的sql语句,多个SqlSession可以公用二级缓存,二级缓存

Mybatis学习---了解Mybatis

什么是Mybatis 对MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBatis 使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Object,普通的 Java 对象)映射成数据库中的记录.(摘自MyBatis官网) MyBatis与Ibatis 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层

Hibernate学习---第四节:一级缓存

一.Hibernate 一级缓存的概念: 一级缓存生命周期很短与 session 生命周期一致,所以一级缓存也叫 session 级缓存或事务级缓存.位于缓存中的对象处于持久化状态,它和表中的相关记录对应,session 能够在某些时间点,按照缓存中持久化对象的属性变化来同步数据库中表的记录,这一过程称为清理缓存. (1).一级缓存实现原理.session 缓存是由它的实现类 sessionImpl 中定义的一些集合属性构成的,原理是保证有一个引用在关联着某个持久化对象,保持它的生命周期不会结束

hibernate中的一级缓存与闪照区

首先Hibernate中的一级缓存默认是打开的,并且范围从session创建到session关闭,存储的数据必须是持久态的数据. 1 //从session创建开始,一级缓存也跟着创建 2 Session session = HibernateSessionFactory.getSession(); 3 ... 4 //到session关闭,一级缓存 5 session.close(); 一级缓存的执行流程: 如果现在需要获得一个数据库里面的账号为“980517”的用户,执行Java代码 1 Us

详解Hibernate中的一级缓存

1.前言 在Hibernate中有三级缓存,本篇博客先详细的介绍一下,Hibernate中的一级缓存,也就是Session级别的缓存. 2.持久化对象 如果要说到Hibernate的缓存的话,那么首先咱得提一下hibernate中的持久化对象. 其中持久化对象有三种状态,分别是: transient(瞬时态):尚未与Session关联对象,失去引用的话,就会被JVM回收.一般就是直接New创建的对象. persistent(持久态):已经与当前session产生关联,并且相关联的session没

JavaScript学习12 JS中定义对象的几种方式【转】

avaScript学习12 JS中定义对象的几种方式 转自:  http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工厂方式 3.构造函数方式 4.原型("prototype")方式 5.动态原型方式 一.基于已有对象扩充其属性和方法 <script type="text/javascript