二级缓存

《深入理解mybatis原理》 MyBatis的二级缓存的设计原理

微笑、不失礼 提交于 2019-11-30 08:26:21
[+] MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。本文将全面分析MyBatis的二级缓存的设计原理。 1.MyBatis的缓存机制整体设计以及二级缓存的工作模式 如上图所示,当开一个会话时,一个 SqlSession 对象会使用一个 Executor 对象来完成会话操作, MyBatis 的二级缓存机制的关键就是对这个 Executor 对象做文章。如果用户配置了" cacheEnabled=true ",那么 MyBatis 在为 SqlSession 对象创建 Executor 对象时,会对 Executor 对象加上一个装饰者: CachingExecutor ,这时 SqlSession 使用 CachingExecutor 对象来完成操作请求。 CachingExecutor 对于查询请求,会先判断该查询请求在 Application 级别的二级缓存中是否有缓存结果,如果有查询结果,则直接返回缓存结果;如果缓存中没有,再交给真正的 Executor 对象来完成查询操作,之后 CachingExecutor 会将真正 Executor 返回的查询结果放置到缓存中,然后在返回给用户。 CachingExecutor 是 Executor 的装饰者,以增强 Executor 的功能,使其具有缓存查询的功能

Mybatis缓存篇

坚强是说给别人听的谎言 提交于 2019-11-30 05:45:25
一、一级缓存(本地缓存):作用域为SqlSession级别的缓存,默认开启。与数据库一次会话期间查询到的数据将会 放入一级缓存。 不使用一级缓存情况:1、SqlSession不一致 2、查询条件不同 3、查询前有过增删改操作 4、手动清空了SqlSession的缓存:sqlSession.clearCache(); 二、二级缓存(sql映射文件缓存):作用域为一个sql映射文件,默认不开启,当一个会话提交或关闭后一级缓存的数据 就会存入二级缓存。 开启二级缓存步骤 1、全局配置文件中增加配置:<setting name="cacheEnabled" value="true"/> 2、在sql映射文件中<mapper>下增加:<cache></cache> 3、在Bean对象(POJO)中实现序列化接口:implements Serializable <cache>标签的一些属性 eviction:缓存的回收策略: • LRU – 最近最少使用的:移除最长时间不被使用的对象。 • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。 • SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。 • WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。 • 默认的是 LRU。 flushInterval:缓存清空时间,单位为毫秒,默认不清空。

mybatis与hibernate区别

坚强是说给别人听的谎言 提交于 2019-11-30 02:30:12
具体从几个方面说一下两者的区别: 1.两者最大的区别: 针对简单逻辑,Hibernate和MyBatis都有相应的代码生成工具,可以生成简单基本的DAO层方法。 针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。 2.开发难度对比 Hibernate的开发难度要大于Mybatis。主要由于Hibernate比较复杂、庞大,学习周期较长。 而Mybatis则相对简单一些,并且Mybatis主要依赖于sql的书写,让开发者感觉更熟悉。 3.sql书写比较 Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。不过没有自己的日志统计,所以要借助log4j来记录日志。 Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。不过Hibernate具有自己的日志统计。 4.数据库扩展性比较 Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。 Hibernate与数据库具体的关联都在XML中,所以HQL对具体是用什么数据库并不是很关心。 5.缓存机制比较 相同点:Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案

java架构之路-(源码)mybatis的一二级缓存问题

▼魔方 西西 提交于 2019-11-29 21:29:56
  上次博客我们说了mybatis的基本使用,我们还捎带提到一下Mapper.xml中的select标签的useCache属性,这个就是设置是否存入二级缓存的。 回到我们正题,经常使用mybatis的小伙伴都知道,我们的mybatis是有两级缓存的,一级缓存默认开启,我们先来一下一级缓存吧,超级简单。 一级缓存: 我们还拿上次的源码来说 package mybatis; import mybatis.bean.StudentBean; import mybatis.dao.StudentMapper; 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.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; public class Test1 { public SqlSession session;

缓存

霸气de小男生 提交于 2019-11-29 16:40:10
一、 MyBatis缓存介绍   正如大多数持久层框架一样,MyBatis 同样提供了 一级缓存 和 二级缓存 的支持 一级缓存 : 基于PerpetualCache 的 HashMap本地缓存,其 存储作用域为 Session ,当 Session flush 或 close 之后,该 Session中的所有 Cache 就将清空 。   2. 二级缓存 与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其 存储作用域为 Mapper(Namespace) ,并且 可自定义存储源 ,如 Ehcache。   3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。 1.1、 Mybatis一级缓存测试 1 package me.gacl.test; 2 3 import me.gacl.domain.User; 4 import me.gacl.util.MyBatisUtil; 5 import org.apache.ibatis.session.SqlSession; 6 import org.junit.Test; 7 8 /** 9 * @author gacl 10 * 测试一级缓存 11 */

第四章、Mybatis的缓存机制

扶醉桌前 提交于 2019-11-29 14:00:51
文章目录 什么是缓存? 什么是Mybatis中的缓存? 1、缓存机制的简介 2、一级缓存 2.1、一级缓存的使用 2.2、一级缓存失效的几种情况 (1)不同的SqlSession对应不同的一级缓存 (2)同一个SqlSession但是查询条件不同 (3)同一个SqlSession两次查询期间执行了任何一次增删改操作 (4)同一个SqlSession两次查询期间手动清空了缓存 2.3、一级缓存的执行流程 2.4、为什么一级缓存叫查询缓存 2.5、为什么一级缓存会失效 3、二级缓存 3.1、二级缓存的使用 3.2、二级缓存的工作流程 3.3、二级缓存失效的条件 3.4、多表操作对二级缓存的影响 解决办法 3.5 二级缓存源码解析 3.5.1 二级缓存的创建 3.5.2 二级缓存的使用 3.6 是否应该使用二级缓存? 4、缓存的相关属性设置 5、整合第三方缓存 什么是缓存? 缓存是内存中的一个对象,用于对数据库查询结果的保存,用于减少与数据库的交互次数从而减低数据库的压力,进而提高响应速度。 什么是Mybatis中的缓存? Mybatis中的缓存就是说Mybatis在执行一次SQL查询或者SQL更新之后,这条SQL语句并不会消失,而是 被Mybatis缓存起来,当再次执行相同SQL语句的时候,就会直接从缓存中进行提取,而不是再次执行SQL命令。 1、缓存机制的简介 (1)MyBatis

Hibernate缓存策略详解

落花浮王杯 提交于 2019-11-29 13:20:59
Hibernate缓存策略 1. 数据缓存 1.1. 概述 缓存是数据库数据临时容器,它包含了库表数据的临时拷贝,位于数据库与数据访问层之间。 ORM 在进行数据读取时,会根据其缓存管理策略,首先在内存中查询,如果在内存中发现所需数据(缓存命中),则直接以此数据错位查询结果加以利用,从而避免了数据库调用的性能开销。 缓存的介质一般是内存,所以读写速度很快。但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期。 1.2. 缓存范围 缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围分为三级。 1) 事物级缓存(Transaction Layer Cache ) 缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,缓存内的数据通常采用相互关联的的对象形式。 2) 应用级/进程级缓存(Appli cat ion/ProcessLayer Cache) 缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依 赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据

Mybatis3.4.x技术内幕(二十二):Mybatis一级、二级缓存原理分析

↘锁芯ラ 提交于 2019-11-29 11:18:48
Mybatis的一级缓存,指的是SqlSession级别的缓存,默认开启;Mybatis的二级缓存,指的是SqlSessionFactory级别的缓存,需要配置。缓存是针对select来说的。 1、一级缓存 <configuration> <settings> <setting name="localCacheScope" value="SESSION|STATEMENT" /> </settings> </configuration> localCacheScope用于配置一级缓存的范围,默认值是SESSION,表示SqlSession范围; 如果配置为STATEMENT,则表示SqlSession范围内的一个查询范围,但它并不是一个Statement实例范围。 STATEMENT举例:查询Student对象发送一次sql查询,紧接着再发一次sql查询关联的Teacher对象,这个完整过程称之为一个查询。 一级缓存默认开启,且没有全局关闭的配置开关。 <select ... flushCache="false" useCache="true|false"/> flushCache:同时影响了一级、二级缓存,flushCache=true,会导致清空本条sql(当前MappedStatement)的一级、二级缓存,注意是当前的,不影响其他的MappedStatement。

Hibernate一级缓存 & 二级缓存

℡╲_俬逩灬. 提交于 2019-11-29 05:57:14
一、一级缓存 Session 的操作与维护 1. Hibernate 对象的三种状态 : transient , persistent , detached 1) transient : 瞬时状态 利用 new 关键字创建的对象 , 没有与 Hibernate 实施交互的,也无法保证与数据库中某条记录对应的对象被称为瞬时状态,也就是生命周期非常短的意思,因为没有任何组件管理的对象非常容易被 Java 虚拟机回收。 例 :Customer cus = new Customer();// 瞬时状态对象 2) persistent : 持久化状态 将瞬时状态的对象保存到 Hibernate 缓存中,受 Hibernate 管理的对象被称为持久化状态Hibernate在调用 flush , close , clear 方法的时候会清理缓存保证持久化对象与底层数据库的同步,所有的持久化对象, Hibernate 均会为它设置一个唯一性标识符保证其在缓存中的唯一性,这个标识符可能是 hashCode, 带主键查询的 sql 语句或者其他保证唯一的字符。 save (new object), update (new object), saveorupdate (new object), persisnt (new object) 可以将一个瞬时状态转变为持久化对象 save (new

Springboot2.0下通过redis实现支持分布式的mybatis二级缓存

北城余情 提交于 2019-11-29 04:41:22
最近领导要求在项目中加下mybatis二级缓存,由于当前项目是分布式微服务,且是多节点部署的,而司内缓存中间件使用的redis,那很自然的要用redis做分布式缓存支持,避免出现直接使用原生mybatis二级缓存造成缓存数据不一致等问题。下面会对基于redis的mybatis二级缓存实现做下简单介绍,涉及一些概念,同时一些坑点做下整理。 1. 一级缓存 一级缓存是在SqlSession级别的缓存,MyBatis默认开启一级缓存。即同一个SqlSession对象,相同参数多次调用同一个Mapper方法时,只执行一次SQL,第一次查询后数据被缓存起来,之后的调用在没有缓存刷新、超时情况下都是直接先从缓存中取数据,不再去查数据库。不同SqlSession间,缓存是隔离的。 此外实际项目开发中,一级缓存存在很大的局限性,我们的项目一般是Spring+Mybatis集成开发,而Spring的事务管理在逻辑层,每个service对应不同的SqlSession(这是通过MapperScannerConfigurer类创建SqlSession自动注入到service中的), 每次查询之后都会关闭SqlSession,缓存数据就会被清空。所以Spring整合之后,如果没有事务,一级缓存是没有实际意义的。 2. 二级缓存 二级缓存是Mapper级别的缓存,Mybatis默认不开启二级缓存