像大多数的持久化框架一样,Mybatis也提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能。

Mybatis中缓存分为一级缓存,二级缓存。

证明一级缓存的存在

一级缓存是SqlSession级别的缓存,只要SqlSession没有flush或close,它就存在。

一级缓存的分析

一级缓存是SqlSession范围的缓存,当调用SqlSession的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。

第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息。

得到用户信息,将用户信息存储到一级缓存中。

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

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

package com.learn.test;import com.learn.dao.IUserDao;
import com.learn.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.InputStream;public class UserTest {private InputStream in;private  SqlSessionFactory factory;private SqlSession sqlSession;private IUserDao userDao;@Before//用于在测试方法执行之前执行public void init()throws Exception{//1.读取配置文件,生成字节输入流in = Resources.getResourceAsStream("SqlMapConfig.xml");//2.获取SqlSessionFactoryfactory = new SqlSessionFactoryBuilder().build(in);//3.获取SqlSession对象sqlSession = factory.openSession(true);//4.获取dao的代理对象userDao = sqlSession.getMapper(IUserDao.class);}@After//用于在测试方法执行之后执行public void destroy()throws Exception{//提交事务// sqlSession.commit();//6.释放资源sqlSession.close();in.close();}/*** 测试一级缓存*/@Testpublic void testFirstLevelCache(){User user1 = userDao.findById(41);System.out.println(user1);//        sqlSession.close();
//        再次获取SqlSession对象
//        sqlSession = factory.openSession();sqlSession.clearCache();//此方法也可以清空缓存userDao = sqlSession.getMapper(IUserDao.class);User user2 = userDao.findById(41);System.out.println(user2);System.out.println(user1 == user2);}/*** 测试缓存的同步*/@Testpublic void testClearlCache(){// 1.根据id查询用户User user1 = userDao.findById(41);System.out.println(user1);// 2.更新用户信息user1.setUsername("update user clear cache");user1.setAddress("北京市海淀区");userDao.updateUser(user1);// 3.再次查询id为41的用户User user2 = userDao.findById(41);System.out.println(user2);System.out.println(user1 == user2);}
}

Mybatis中的一级缓存相关推荐

  1. Mybatis 中的一级缓存与二级缓存

    一,Mybatis中为什么要有缓存   缓存的意义是将用户经常查询的数据放入缓存(内存)中去,用户去查询数据的时候就不需要从磁盘(关系型数据库)中查询,直接从缓存中查询,从而提高了查询效率,解决了高并 ...

  2. MyBatis中的一级缓存和二级缓存介绍

    先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能. 一级缓存 一级 ...

  3. java mysql 二级缓存_深入理解MyBatis中的一级缓存与二级缓存

    http://blog.csdn.net/weixin_36380516/article/details/73194758 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中 ...

  4. mybatis黑马:一级缓存和二级缓存

    IUserDao.java,User.java代码与之前类似,就不写了 1.缓存:存在于内存中的临时数据. 2.为什么使用缓存:减少和数据库的交互次数,提高执行效率. 3.什么样的数据能使用缓存,什么 ...

  5. 【MyBatis学习13】MyBatis中的二级缓存

    1. 二级缓存的原理 前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的.为了更加 ...

  6. hibernate中的一级缓存

    hibernate中的一级缓存 Hibernate提供了两种缓存,这里主要写一级缓存. 第一级缓存是session的缓存,由于Session对象的生命周期通常对应一个数据事务或者一个应用事务,因此它的 ...

  7. mybatis中的查询缓存

    转载自:https://www.cnblogs.com/zhangzongle/p/6211285.html 查询缓存 Mybatis提供查询缓存,用于减轻数据压力,提高数据库压力. Mybatis提 ...

  8. Mybatis 详解--- 一级缓存、二级缓存

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据 ...

  9. mybatis 详解------ 一级缓存、二级缓存(九)

    mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMa ...

最新文章

  1. SAP BADI应用
  2. 搜狗浏览器挡住了任务栏,上下显示不全
  3. 硬件结构(中):EqualLogic PS5000 对等存储“动车组”
  4. 前端面试题目汇总摘录(JS 基础篇)
  5. 4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例
  6. 鲜为人知的4个Python功能,用对了事半功倍
  7. mysql怎么打开php文件_如何打开php文件
  8. 华为lab-rs-v1-1.5_smart link
  9. dx逆向建模步骤_什么是3D打印?游戏建模具体是什么的?哪个更有发展
  10. python 自动解4399数独游戏
  11. 鱼鹰软件签约知名创意活动公司HOFO公关
  12. util.Date和sql.Date之间的转换
  13. async/await的用法
  14. 基于sdm660 androidO----MTP driver 分析
  15. iFIXIT认为 HTC One M8 是近年最难维修的手机之一
  16. 微信小程序学习笔记--测颜值
  17. ios分屏_苹果分屏功能怎么用?教你一键开启iPad分屏
  18. Python用10行代码爬取大批美女图片
  19. html select 样式t调整_css修改html select下拉框样式(含右边箭头)
  20. Linux objdump命令(反汇编、查看符号)

热门文章

  1. rtems 4.11 RTC驱动 (arm, beagle)
  2. POJ 1041 John's trip(欧拉回路)
  3. iOS开发时间戳与时间,时区的转换,汉字与UTF8,16进制的转换
  4. 【定时任务】Quartz用法详解
  5. 【模板】AC自动机(加强版)
  6. NetCat Tutorials
  7. 罗杰斯:做你喜欢的工作,你会变成个有钱人
  8. PowerDesigner(16.1)使用
  9. Visual Studio 2010中的UML
  10. Sybase数据库中找回丢失的sa密码