二级缓存

Mybatis的缓存

断了今生、忘了曾经 提交于 2019-11-29 03:29:34
Mybatis的一级缓存是默认开启的是sqlsession级别的 Mybatis的二级缓存是SQL sessionfactory级别的默认没有开启需要在setting全局参数中配置开启就是多个sqlsession操作同一个Mapper文件的sql语句 , 多个sqlsession去数据库操做的到数据会存在二级缓存的区域中 但是多个sqlsession同时操作同一张数据库表的时候会出现脏。读二级缓存是多个SQL session共享的。 来源: https://www.cnblogs.com/zhaohuihui/p/11443522.html

MyBatis学习笔记:缓存配置

陌路散爱 提交于 2019-11-28 19:59:48
使用缓存可以使应用更快地获取数据,避免频繁的数据库交互。MyBatis 作为持久化框架,提供了非常强大的查询缓存特性。 一般提交 MyBatis 缓存的时候,都是指二级缓存。一级缓存(也叫本地缓存)默认会启用,并且不能控制,因此很少会提到。 MyBatis 的一级缓存存在于 SqlSession 的生命周期中,在同一个 SqlSession 中查询时,MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个 Map 对象中。如果同一个 SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当 Map 缓存对象中已经存在该键值时,则会返回缓存中的对象。 如果在方法上添加了 flushCache="true" ,那么就会在查询数据前清空当前的一级缓存。需要注意的是,任何和 insert update delete 操作都会清空一级缓存,再次查询时就会执行数据库查询。 二级缓存可以理解为存在于 SqlSessionFactory 的生命周期中。二级缓存是在 MyBatis 的全局配置 setting 中有一个参数 cacheEnabled,可以在 mybatis-config.xml 中添加如下代码: <settings> <setting name="cacheEnabled" value="true"/> </settings>

MyBatis开发重点知识

末鹿安然 提交于 2019-11-28 16:35:18
1.1 为什么需要 ORM 框架? 传统的 JDBC 编程存在的弊端: ü 工作量大,操作数据库至少要 5 步; ü 业务代码和技术代码耦合; ü 连接资源手动关闭,带来了隐患; MyBatis 前身是 iBatis, 其源于“ Internet ”和“ ibatis ”的组合,本质是一种半自动的 ORM 框架,除了 POJO 和映射关系之外,还需要编写 SQL 语句; Mybatis 映射文件三要素: SQL 、映射规则和 POJO ; 1.2 MyBatis 快速入门 步骤如下: 加入 mybatis 的依赖,版本 3.5.x 添加 mybatis 的配置文件,包括 MyBatis 核心文件和 mapper.xml 文件 场景介绍:基于 t_user 表单数据查询、多数据查询; 编写实体类、 mapper 接口以及 mapper xml 文件; 编写实例代码:com.enjoylearning.mybatis.MybatisDemo. quickStart 核心类分析: SqlSessionFactoryBuilder :读取配置信息创建 SqlSessionFactory ,建造者模式,方法级别生命周期; SqlSessionFactory :创建 Sqlsession ,工厂单例模式,存在于程序的整个生命周期; SqlSession :代表一次数据库连接,一般通过调用

myBatis深入学习

别说谁变了你拦得住时间么 提交于 2019-11-28 15:00:16
本文在前一篇文章的基础上记录了对mybatis的表之间的关系映射、延迟加载、缓存等高级功能的学习。 1.表之间的关系映射   既然要明确表之间的关系映射,那么首先要分析数据库中表之间的关系,假设数据库中现在有4张表:user(用户表,记录了购买商品的用户信息)、orders(订单表,记录了用户所创建的订单)、orderdetails(订单明细表,记录了订单的详细信息即购买商品的信息)、items(商品表,记录了商品信息),对数据库中表的分析要重点看表中的 主键、非空字段、外键 ,经过对表的分析,可以得到如下的数据模型分析:    一对一查询   一对一的查询在实现时可以使用resultType和resultMap实现,关于二者的区别如下:   resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。如果没有查询结果的特殊要求建议使用resultType。   resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。resultMap可以实现延迟加载,resultType无法实现延迟加载。 一对多查询  

16-二级缓存

老子叫甜甜 提交于 2019-11-28 11:10:24
目录 一、SqlMapConfig.xml 二、IUserDao.xml 三、JAVA 代码 四、Log 输出 五、总结 二级缓存: 它指的是 Mybatis 中 SqlSessionFactory 对象的缓存。由同一个 SqlSessionFactory 对象创建的 SqlSession 共享其缓存 二级缓存的使用步骤 让 Mybatis 框架支持二级缓存(在SqlMapConfig.xml配置) 让当前的映射文件支持二级缓存(在IUserDao.xml中配置) 让当前的操作支持二级缓存(在select标签中配置) 一、SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbcConfig.properties"/> <settings> <!--默认为 true--> <setting name="cacheEnabled" value="true"/> </settings> <typeAliases>

Hibernate 缓存机制(N+1问题)详解

≡放荡痞女 提交于 2019-11-28 07:10:09
Hibernate 缓存机制: 担心:两张表查询(关联查询)起来效率会不会低呢??hibernate 缓存机制非常强大。。。 缓存:介于应用程序和物理数据源之间为了降低应用程序对物理数据源的访问频率,从而提高应用的运行性能(缓存内的数据是对物理数据源的复制,缓存的介质一般是内存,所以读取速度很快;如果缓存中的年数据量很大 将硬盘作为介质)。缓存的实现不仅考虑介质,换应该考虑缓存的并发访问和缓存数据的生命周期。 Hibernate是一个持久层框架,经常访问物理数据库,为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。 N+1问题: N+1问题: 返回查询列表时获取对象的两种方法: list() 方法会发出sql 查询出该对象;(一条sql) iterator()方法 会发出取 id 列表的sql ,在查询相应的具体的某个学生信息时,会发出相应的SQL去取学生信息; iterator()方法 来获得对象时,hibernate会先发出取出所有对象id 值 的sql ,大会需要查询某个对象 的具体信息时,hibernate会根据取出的 id 值 发出相应的SQL 语句从数据库中去取具体的对象信息,这就是典型的N+1 问题! iterator()方法 获取对象是产生N+1问题 为什么不直接用list() 还要保留iterator()方法 ?? list() 方法每次返回对象

《深入理解mybatis原理》 MyBatis缓存机制的设计与实现

主宰稳场 提交于 2019-11-28 07:05:54
本文主要讲解 MyBatis 非常棒的缓存机制的设计原理,给读者们介绍一下 MyBatis 的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论。 MyBatis 将数据缓存设计成两级结构,分为一级缓存、二级缓存: 一级缓存是 Session 会话级别的缓存 ,位于表示一次数据库会话的 SqlSession 对象之中,又被称之为本地缓存。一级缓存是 MyBatis 内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(不过这也不是绝对的,可以通过开发插件对它进行修改); 二级缓存是 Application 应用级别的缓存 ,它的是生命周期很长,跟 Application 的声明周期一样,也就是说它的作用范围是整个 Application 应用。 MyBatis 中一级缓存和二级缓存的组织如下图所示: 一级缓存的工作机制: 一级缓存是 Session 会话级别的,一般而言,一个 SqlSession 对象会使用一个 Executor 对象来完成会话操作, Executor 对象会维护一个 Cache 缓存,以提高查询性能。关于一级缓存的详细实现,我已经在 《深入理解mybatis原理》 MyBatis的一级缓存实现详解 及使用注意事项 一文中有非常详尽的讨论,读者可以前去了解。 二级缓存的工作机制: 如上所言,一个 SqlSession

mybatis框架学习-缓存

僤鯓⒐⒋嵵緔 提交于 2019-11-27 11:30:32
罗里吧嗦 什么是缓存 Mybatis中的缓存 什么是缓存 存在于内存中的临时数据。 为什么使用缓存 减少和数据库的交互次数,提高执行效率。 什么样的数据能使用缓存,什么样的数据不能使用 适用于缓存: 经常查询并且不经常改变的。 数据的正确与否对最终结果影响不大的。 不适用于缓存: 经常改变的数据 数据的正确与否对最终结果影响很大的。 例如:商品的库存,银行的汇率,股市的牌价。 Mybatis中的一级缓存和二级缓存 一级缓存: 它指的是Mybatis中SqlSession对象的缓存。 当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。 该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中 查询是否有,有的话直接拿出来用。 当SqlSession对象消失时,mybatis的一级缓存也就消失了。 二级缓存: 它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。 二级缓存的使用步骤: 第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置) 第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置) 第三步:让当前的操作支持二级缓存(在select标签中配置) 一级缓存

Mybatis一级缓存、二级缓存

冷暖自知 提交于 2019-11-27 06:42:34
以下内容来自美团技术博客: 聊聊MyBatis缓存机制 前言 MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis的默认缓存配置,但是MyBatis缓存机制有一些不足之处,在使用中容易引起脏数据,形成一些潜在的隐患。个人在业务开发中也处理过一些由于MyBatis缓存引发的开发问题,带着个人的兴趣,希望从应用及源码的角度为读者梳理MyBatis缓存机制。 本次分析中涉及到的代码和数据库表均放在GitHub上,地址: mybatis-cache-demo 。 目录 本文按照以下顺序展开。 一级缓存介绍及相关配置。 一级缓存工作流程及源码分析。 一级缓存总结。 二级缓存介绍及相关配置。 二级缓存源码分析。 二级缓存总结。 全文总结。 一级缓存 一级缓存介绍 在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性能。具体执行过程如下图所示。 每个SqlSession中持有了Executor,每个Executor中有一个LocalCache。当用户发起查询时,MyBatis根据当前执行的语句生成MappedStatement,在Local Cache进行查询,如果缓存命中的话

mybatis一级缓存二级缓存

丶灬走出姿态 提交于 2019-11-27 03:00:10
一级缓存   Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。                  为什么要使用一级缓存,不用多说也知道个大概。但是还有几个问题我们要注意一下。    1、一级缓存的生命周期有多长?    a、MyBatis在开启一个数据库会话时,会 创建一个新的 SqlSession 对象, SqlSession 对象中会有一个新的 Executor 对象。 Executor 对象中持有一个新的 PerpetualCache 对象;当会话结束时, SqlSession 对象及其内部的 Executor 对象还有 PerpetualCache 对象也一并释放掉。   b、如果 SqlSession 调用了 close() 方法,会释放掉一级缓存 PerpetualCache 对象,一级缓存将不可用。   c、如果 SqlSession 调用了