在月黑风高的某天夜晚,boss chen语重心长的发条了消息给小草说:“小草啊,是时候写写博客来记录平常自己积累的东西了......”。小草一听,平常没有写博客的习惯,在平常开发中只是用笔记记录自己的所得(分散的小点),写博客的心思还处于萌芽之中,boss chen的话彻底让萌芽“破土而出”。

之后便有了本博主的博客之旅......小草的Dream。

  第一次写博客,也不知道从哪里开始写,想来想去先从平常接触比较多的mybatis开始写吧!

mybatis的缓存机制

一级缓存

mybatis配置中是默认启用一级缓存的(默认的是SESSION级别),当然也可以再次手动设置

<setting name="localCacheScope" value="SESSION"/>

注:一级缓存有连个选项,SESSION或者STATEMENT,默认是SESSION。

测试案例:

1.在一个service中对某个id查询多次

可以看出真正与数据库交互的只有第一次查询,第二次,第三次查询是通过查询缓存得出的。

2.当在同一个会话中进行了增删语句之后,一级缓存会失效

例如当在上述例子中的第二部修改为删除的一条语句,一级缓存会失效

可以看出在第二部进行删除操作后,1~3步骤都对数据库进行操作,所以在进行增删的操作后,执行相同的查询语句,一级缓存会失效。

3.原理见图(欢迎指正)

4.SqlSession 方法解析:

SqlSession中提供了与数据交互的方法

  <T> T selectOne(String var1);

  <T> T selectOne(String var1, Object var2);

  <E> List<E> selectList(String var1);

  <E> List<E> selectList(String var1, Object var2);

  <E> List<E> selectList(String var1, Object var2, RowBounds var3);

  <K, V> Map<K, V> selectMap(String var1, String var2);

  <K, V> Map<K, V> selectMap(String var1, Object var2, String var3);

  <K, V> Map<K, V> selectMap(String var1, Object var2, String var3, RowBounds var4);

  <T> Cursor<T> selectCursor(String var1);

  <T> Cursor<T> selectCursor(String var1, Object var2);

  <T> Cursor<T> selectCursor(String var1, Object var2, RowBounds var3);

  void select(String var1, Object var2, ResultHandler var3);

  void select(String var1, ResultHandler var2);

  void select(String var1, Object var2, RowBounds var3, ResultHandler var4);

  int insert(String var1);

  int insert(String var1, Object var2);

  int update(String var1);

  int update(String var1, Object var2);

  int delete(String var1);

  int delete(String var1, Object var2);

  void commit();

  void commit(boolean var1);

  void rollback();

  void rollback(boolean var1);

  List<BatchResult> flushStatements();

  void close();

  void clearCache();

  Configuration getConfiguration();

  <T> T getMapper(Class<T> var1);

  Connection getConnection();

Executor是与操作数据库有关的职责都会被委托。Executor有若干个实现类,为Executor赋予了不同的能力,之后参考源码进行深入学习。

5.至此,通过源码的分析一个简单的上述案例的原因(insert/delete/update方法,缓存就会刷新的原因)

SqlSession的insert方法和delete方法,都会统一走update的流程,代码如下所示:

  @Override

  public int insert(String statement, Object parameter) { return update(statement, parameter);
  }

   @Override
  public int delete(String statement) { return update(statement, null);
  }

  update方法也是委托给了Executor执行。BaseExecutor的执行方法如下所示。

  @Override

  public int update(MappedStatement ms, Object parameter) throws SQLException {
    ErrorContext.instance().resource(ms.getResource()).activity("executing an update").object(ms.getId());

     if (closed) {

       throw new ExecutorException("Executor was closed.");
    }
      clearLocalCache();

        return doUpdate(ms, parameter);
  }

  每次执行update前都会清空localCache。

mybatis一级缓存:

MyBatis一级缓存的生命周期和SqlSession一致。

MyBatis一级缓存内部设计简单,只是一个没有容量限定的HashMap,在缓存的功能性上有所欠缺。

MyBatis的一级缓存最大范围是SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据,建议设定缓存级别为Statement。

(未完待续......)

之后一遍介绍mybatis的二级缓存,请期待......

mybati缓存机制之一级缓存的更多相关文章

  1. MyBatis缓存机制(一级缓存,二级缓存)

    一,MyBatis一级缓存(本地缓存) My Batis 一级缓存存在于 SqlSession 的生命周期中,是SqlSession级别的缓存.在操作数据库时需要构造SqlSession对象,在对象中 ...

  2. hibernate笔记--缓存机制之 一级缓存(session缓存)

    一级缓存: 又称为session缓存,它和session生命周期相同,周期非常短.是事务级别的缓存: 还是以Book和Category这两个表为例,我们用代码观察一个缓存的存在: 假设现在我要去查询i ...

  3. mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache

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

  4. mybatis源码分析(7)-----缓存Cache(一级缓存,二级缓存)

    写在前面  MyBatis 提供查询缓存,用于减轻数据库压力,提高数据库性能. MyBatis缓存分为一级缓存和二级缓存. 通过对于Executor 的设计.也可以发现MyBatis的缓存机制(采用模 ...

  5. 为什么CPU缓存会分为一级缓存L1、L2、L3?有什么意义?

    https://baijiahao.baidu.com/s?id=1598811284058671259&wfr=spider&for=pc 简介:CPU缓存是CPU一个重要的组成部分 ...

  6. mybatis缓存,包含一级缓存与二级缓存,包括ehcache二级缓存

    一,引言 首先我们要明白一点,缓存所做的一切都是为了提高性能.明白了这一点下面我们开始进入正题. 二,mybatis缓存概要 ①.mybatis的缓存有两种,分别是一级缓存和二级缓存.两者都属于查询缓 ...

  7. mybati缓存机制之二级缓存配置

    二级缓存配置 在MyBatis的配置文件中开启二级缓存. <setting name="cacheEnabled" value="true"/> 在 ...

  8. 缓存机制总结(JVM内置缓存机制,MyBatis和Hibernate缓存机制,Redis缓存)

    一.JVM内置缓存(值存放在JVM缓存中) 我们可以先了解一下Cookie,Session,和Cache Cookie:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cooki ...

  9. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...

随机推荐

  1. Git钩子详解

    钩子 Git钩子是在Git仓库中特定事件发生时自动运行的脚本.可以定制一些钩子,这些钩子可以在特定的情况下被执行,分为Client端的钩子和Server端的钩子.Client端钩子被operation ...

  2. PHP 8中数据类型

    PHP  一共支持八种数据类型 4种标量数据类型 boolean布尔型   只有两个值  true 和  flase integer整形  包括正整数和负整数,无小数位 float/double 浮点 ...

  3. 【转】MySQL双主一致性架构优化

    [原文]https://www.toutiao.com/i6594414914838725133/ 一.双主保证高可用 MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能 ...

  4. django版本切换以及更改url(pycharm)

    Django版本切换:https://blog.csdn.net/weixin_42305814/article/details/80742090 因为是从2版本更改到1版本,所以里面一些东西需要变动 ...

  5. JAVA反射机制_获取字节码文件对象

    是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...

  6. BZOJ4300:绝世好题(DP)

    Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数 ...

  7. Leetcode——198. 打家劫舍

    题目描述:题目链接 这道题目也是一道动态规划的题目: 分析一道动态规划的题目可以将解决问题的思路分为下面三个部分: 1:问题的描述.可以定义数组d[ i ] 用于表示第i -1家可以获得的最大金额. ...

  8. POJ 1904 King's Quest(SCC的巧妙应用,思维题!!!,经典题)

    King's Quest Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 10305   Accepted: 3798 Ca ...

  9. python 爬虫--同花顺-使用代理

    1.http://www.goubanjia.com/  在上面获取 使用http协议的公网IP和端口 参考:https://blog.csdn.net/qq_23934063/article/det ...

  10. OO课程学期末总结

    OO课程学期末总结 测试VS正确性论证 OCL vs JSF 对象约束语言(Object Constraint Language), 简称OCL, 是一种指示用户建模系统中的限制方式. 他是UML可选 ...