文档章节

Mybatis 缓存学习

learn_more
 learn_more
发布于 2016/02/20 23:26
字数 877
阅读 154
收藏 9


引用

缓存就是存贮数据(使用频繁的数据)的临时地方,因为取原始数据的代价太大了,所以我可以取得快一些。


1、一级缓存与二级缓存的差异

1)二级缓存默认关闭,一级缓存默认开启,二级缓存以Mapper的namespace为单位,但是一级缓存以sqlsession为单位,如果采用Spring管理对象,那么每次一个事务就会有一个sqlsession。

2)二级缓存的读取都采用了锁控制并发,但是一级缓存并没有,而且Mybatis强调了sqlsession不应该多线程共享,看到这里确实是有道理的,第一个是sqlsession关闭了在使用会报错,其二是读写缓存数据都没有加锁;然而,二级缓存虽然是建立在一级缓存之上,但是二级缓存采用了SynchronizedCache缓存,对数据的读写都进行了加锁,整个二级缓存就是一个责任链模式,从 SynchronizedCache(读写加锁)——>LoggingCache(命中率记录)——>SerializedCache(缓存值序列化、反序列化)——>LruCache(移除无用缓存)——>PerpetualCache(一级缓存,缓存数据的存储);

3)二级缓存采用的Executor是BaseExecutor;二级缓存采用的Executor是CachingExecutor(内部委托BaseExecutor进行数据库操作);


2、一级缓存代码

      
      if (cachedList != null) {
        list = cachedList;
      } else {
        
        try {
          list = doQuery(ms, parameter, rowBounds, resultHandler);
        } finally {
          localCache.removeObject(key);
        }
        localCache.putObject(key, list);
      }
    } finally {
      queryStack--;
    }
    if (queryStack == 0) {
      for (DeferredLoad deferredLoad : deferredLoads) {
        deferredLoad.load();
      }
    }
    return list;
  }


3、一级缓存的理解

所谓一级缓存,就是在一次会话当中,有可能重复执行完全相同的查询语句,为了避免数据库的压力,所以采用缓存的方式,第一次查询的数据放在缓存,第二次直接从缓存中获取数据,注意Java返回的是对象的引用,缓存的也是对象的引用,所以这个对象是可write的。PerpetualCache 就是一级缓存的实现。

一级缓存是一个粗粒度的缓存,没有更新缓存和缓存过期的概念,对于一些隔离级别低的数据库,比如一个事务在查询数据时,另一个事务还可以进行对数据库操作,那么导致前者读出的数据其实是过时数据,那么这个时候的缓存就是有问题的,比如数据库隔离级别是 Read Committed , 那么两次读取的数据可能是不一致的(不可重复读),可是由于缓存将会导致每次得到的数据都是一致的。


4、二级缓存代码

      if (cache != null) {
        flushCacheIfRequired(ms);
        
        try {
          if (ms.isUseCache()) {
            CacheKey key = createCacheKey(ms, parameterObject, rowBounds);
            final List cachedList = (List) cache.getObject(key);
            if (cachedList != null) {
              return cachedList;
            } else {
              List list = delegate.query(ms, parameterObject, rowBounds, resultHandler);
              tcm.putObject(cache, key, list);
              return list;
            }
          } else {
            return delegate.query(ms, parameterObject, rowBounds, resultHandler);
          }
        } finally {
          
        }
      }
    }
    return delegate.query(ms, parameterObject, rowBounds, resultHandler);
  }


5、二级缓存理解

CachingExecutor: 二级缓存执行器。灵活地使用 delegate机制。其委托执行的类是 BaseExcutor。 当无法从二级缓存获取数据时,同样需要从 DB 中进行查询,于是在这里可以直接委托给 BaseExcutor 进行查询。一级缓存就涉及到一个类PerpetualCache ,然而二级缓存则是一个责任链模式的结构,可以通过配置文件指定需要的缓存类

6、二级缓存的设置

在Mapper文件中配置开启二级缓存

<cache

            eviction="FIFO"

            flushInterval="600000"  size="512"

            readOnly="true"

    />


© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
MyBatis学习手记(二)MyBatis缓存机制

MyBatis学习手记二 前:MyBatis官方学习(中文)文档 http://mybatis.github.io/mybatis-3/zh/index.html 一,首先,要使用MyBatis必须使用官方提供的MyBatis的JAR包 链接:https://github.com...

xiaolei123
2015/09/15
1K
4
Mybatis缓存(1)--------系统缓存及简单配置介绍

前言 Mybatis的缓存主要有两种: 系统缓存,也就是我们一级缓存与二级缓存; 自定义的缓存,比如Redis、Enhance等,需要额外的单独配置与实现,具体日后主要学习介绍。 在这里主要记录系统缓...

JJian
2018/07/29
0
0
MyBatis一级缓存原理解析

MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上。MyBatis提供了一级缓存、二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能...

编程SHA
03/28
21
0
Mybatis学习系列(七)缓存机制

Mybatis缓存介绍 MyBatis提供一级缓存和二级缓存机制。 一级缓存是Sqlsession级别的缓存,Sqlsession类的实例对象中有一个hashmap用于缓存数据。不同的Sqlsession实例直接hashmap互不影响。M...

仍是少年
2018/07/12
0
0
MyBaits与Hibernate的区别

相同点:都是持久层的框架,都用于dao层的开发。 不同点: 1. hibernate对sql语句做了封装,使用HQL语句操作数据库。数据库无关性支持好,在项目需要支持多种数据库的情况下,代码开发量少,...

tinder_boy
2018/10/25
15
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
今天
14
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
5
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.3K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部