mybatis的缓存2
原文:https://blog.csdn.net/qq_38274974/article/details/100898145
mybatis的缓存分为一级缓存、二级缓存
那么,我们为什么要使用缓存呢?
       对于经常查询的并且不经常改变的数据,如果每次查询都要与数据库进行交互,这样就大大降低了效率,所以这里就引入了缓存,将一些对结果影响不大且经常查询的数据存放在内存中,从而减少与数据库的交互来提高效率,这就是缓存的优势。
一级缓存
       一级缓存是SqlSession级别的缓存(默认是支持一级缓存,不需要再配置文件中配置一级缓存),在操作数据库时,每个SqlSession类的实例对象中有一个数据结构(HashMap)可以用来存储缓存数据,不同的SqlSession类的实例对象缓存的数据区域(HashMap)是互不影响的。当在同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据写到内存中,第二次查询不执行sql直接从内存中获取。
public class MyBatisTest {
    //mybatis的一级缓存,是SqlSession级别的缓存,只有一个SqlSession对象。
    @Test
    public void test1(){
        SqlSessionFactory ssf=MyBatisUtil.getFactory();
        SqlSession session=ssf.openSession();
        UserMapper um1=session.getMapper(UserMapper.class);
        User user1=um1.selectbyid();
        System.out.println(user1.getUsername());
        //session.clearCache();//清理缓存
        //session.commit();//模拟增删改
        UserMapper um2=session.getMapper(UserMapper.class);
        User user2=um2.selectbyid();
        System.out.println(user2.getUsername());
        session.close();
    }
}
结果:

由此可见,因为缓存,只发生了一次与数据库的交互
如何清理缓存?
方法一:模拟增删改
session.commit();
方法二:调用clearCache()方法
session.clearCache();

而清理缓存后:
二级缓存
       二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。对于访问多的查询请求且用户对查询结果实时性要求不高,此时便可采用mybatis的二级缓存。
1.启动
在核心配置文件mybatis-config.xml中加入
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
2.调用实体类实现序列化接口

实现序列化接口的目的:
     ·为了将数据取出执行反序列化操作
     ·标记接口,打个标记,表示具有一些功能,可以被其它功能对象调用
     ·序列号有方法,可以将对象序列化成二进制文件,也可以将二进制文件反序列化成对象
3.在对应的mapper.xml中加入cache标签
4.测试
@Test
public void test2(){
//mybatis的二级缓存,是mapper级别的缓存,有多个SqlSession对象。
SqlSessionFactory ssf=MyBatisUtil.getFactory();
SqlSession session1=ssf.openSession();
SqlSession session2=ssf.openSession();
SqlSession session3=ssf.openSession();
UserMapper um1=session1.getMapper(UserMapper.class);
User user1=um1.selectbyid();
System.out.println(user1.getUsername());
session1.close(); UserMapper um2=session2.getMapper(UserMapper.class);
User user2=um2.selectbyid();
System.out.println(user2.getUsername());
session2.close(); UserMapper um3=session3.getMapper(UserMapper.class);
User user3=um3.selectbyid();
System.out.println(user3.getUsername());
session3.close();
}
运行结果:

mybatis的缓存2的更多相关文章
- 通过源码分析MyBatis的缓存
		
前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ MyBatis缓存介绍 首先看一段wiki上关于MyBatis缓存的介绍 ...
 - MyBatis 一级缓存与二级缓存
		
MyBatis一级缓存 MyBatis一级缓存默认开启,一级缓存为Session级别的缓存,在执行以下操作时一级缓存会清空 1.执行session.clearCache(); 2.执行CUD操作 3. ...
 - Mybatis学习记录(七)----Mybatis查询缓存
		
1. 什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 sql ...
 - 八 mybatis查询缓存(一级缓存,二级缓存)和ehcache整合
		
1 查询缓存 1.1 什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存.
 - MyBatis一级缓存引起的无穷递归
		
MyBatis一级缓存引起的无穷递归 引言: 最近在项目中参与了一个领取优惠劵的活动,当多个用户领取同一张优惠劵的时候,使用了数据库锁控制并发,起初的设想是:如果多个人同时领一张劵,第一个到达的人领取 ...
 - Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存
		
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——My ...
 - 【MyBatis源码解析】MyBatis一二级缓存
		
MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...
 - mybatis一级缓存二级缓存
		
一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言.所以在参数和SQL完全一样的情况下,我们使用同一个SqlSess ...
 - 深入浅出mybatis之缓存机制
		
目录 前言 准备工作 MyBatis默认缓存设置 缓存实现原理分析 参数localCacheScope控制的缓存策略 参数cacheEnabled控制的缓存策略 总结 前言 提到缓存,我们都会不约而同 ...
 - Mybatis的缓存
		
1.缓存是什么 在 Mybatis 里面,所谓的缓存就是将已经查询过的记录放在内存的缓冲区或文件上,这样如果再次查询,可以通过配置的策略,命中已经查询过的记录,从而提高查询的效率. Mybatis 的 ...
 
随机推荐
- POJ1984
			
题目链接:https://vjudge.net/problem/POJ-1984 解题思路:并查集+离线操作. 用dx[ ]和dy[ ]两个数组存储某点相对于该点所在集合的源头的方位,因此不难推知dx ...
 - POJ3735
			
题目链接:http://poj.org/problem?id=3735 解题思路: 先构造一个(n+1)*(n+1)的单位矩阵E,在此基础上进行操作: 1.g i -------------& ...
 - C语言基础知识(一)——关键字
			
存储类别说明符变量:auto.register.static.extern._Thread_local.typedef 存储类型限定符:const.volatile.restrict._Atomic ...
 - .net core HttpClient 使用之消息管道解析(二)
			
一.前言 前面分享了 .net core HttpClient 使用之掉坑解析(一),今天来分享自定义消息处理HttpMessageHandler和PrimaryHttpMessageHandler ...
 - 附件2:async/await
			
在实际开发中总会遇到许多异步的问题,最常见的场景便是接口请求之后一定要等一段时间才能得到结果,如果遇到多个接口前后依赖,那么问题就变得复杂.大家都一直在尝试使用更好的方案来解决这些问题.最开始只能利用 ...
 - MANIFEST.MF是个什么?
			
MANIFEST.MF是个什么? 写这篇文件主要记录JRA文件里面到底是什么?然后MANIFEST.MF又是什么?Springboot 如何只有Main方法就可以运行的? Springboot项目打包 ...
 - pandas 小技巧
			
1.找出某个字段包含某字符串的行: my_df[my_df['col_B'].str.contains('大连') > 0]或者 my_df[my_df['col_B'].apply(lambd ...
 - 02 . Prometheus告警处理
			
Prometheus告警简介 告警能力在Prometheus的架构中被划分成两个独立的部分.如下所示,通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性的对告 ...
 - UPX的使用
			
UPX是一个通用可执行文件压缩器,由于其具有: 压缩率高:压缩效果优于zip/gzip: 解压速度快:在奔腾133上即可达到大约10MB/秒: 压缩的可执行文件没有额外的内存开销: 安全:可以列表,检 ...
 - 【Linux】文件权限,ssh免密登录
			
1.文件/文件夹权限 例子: -rw-r--r--. 1 root root 12288 Aug 21 09:50 aliases.db drwxr-xr-x. 2 root root 4096 Au ...