首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏愷龍的Blog

    MyBatis:缓存

    目录 缓存介绍 MyBatis缓存 一级缓存 测试 一级缓存失效的四种情况 二级缓存 使用步骤 缓存原理 整合第三方缓存EHCache 缓存介绍 什么是缓存 [ Cache ]? 什么样的数据能使用缓存? 经常查询并且不经常改变的数据。 MyBatis缓存 MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存缓存可以极大的提升查询效率。 MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存 默认情况下,只有一级缓存开启。 (SqlSession级别的缓存,也称为本地缓存) 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。 为了提高扩展性,MyBatis定义了缓存接口Cache。 -- Mybatis EHCache整合包 --> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache

    41220编辑于 2023-01-13
  • 来自专栏mySoul

    MyBatis 缓存

    一级缓存 对于一级缓存来说,Mybatis是直接单个线程隔离的 在执行add,update,delete 的时候,会自动清空缓存,避免脏读造成的影响 此时mapper为线程隔离的,而管理对象为所有线程所共享的 可以看到只查询了一次 需要注意的是缓存在各个SqlSession是相互隔离的 二级缓存 二级缓存直接添加cache即可 <?xml version="1.0" encoding="UTF-8" ? DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd insert update delete 将会刷新缓存 会使用LRU算法进行回收 根据时间表 缓存不会用任何时间顺序来刷新缓存 缓存会存储列表集合或对象 1024个引用 由于对象需要序列化所以需要实现 缓存生效,并为执行sql语句 已经命中缓存 自定义缓存 这个需要实现cache接口 package com.ming.MyBatis; import java.util.concurrent.locks.ReadWriteLock

    81720发布于 2019-04-19
  • 来自专栏同步文章

    mybatis缓存

    mybatis一级缓存 默认开启 基于sqlsession 建立连接后发出请求 然后返回数据就是一次sqlsession 一级缓存的问题: 查询后更新数据再查会出现脏数据 mybatis 二级缓存 基于namespace 默认关闭 二级缓存的问题: 脏数据 比如authorMapper中执行更新操作 BlogMapper中的关联了author数据 这里的数据不会更新 出现脏数据 全部失效 即BlogMapper中更新一条数据 缓存会被清空

    21320编辑于 2022-10-25
  • 来自专栏开源部署

    MyBatis缓存

    1、MyBatis缓存概述 1.1、什么是MyBatis缓存 像大多数的持久化框架一样,MyBatis 也提供了缓存策略,通过缓存策略来减少数据库的查询次数,从而提高性能。 1.2、MyBatis缓存分类 MyBatis缓存分为一级缓存,二级缓存。 默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启。 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。 为了提高扩展性。MyBatis定义了缓存接口Cache。 我们可以通过实现Cache接口来自定义二级缓存 1.3、前期准备 创建一个新的项目mb004 2、MyBatis一级缓存 一级缓存是SqlSession,只要SqlSession没有flush和close DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd

    42720编辑于 2022-09-14
  • 来自专栏冷环渊的全栈工程师历程

    Mybatis缓存

    什么样子的数据可以使用缓存 经常查询并且不经常改变的数据【可以使用缓存Mybatis缓存 MyBatis包含一个非常强大的查询缓存特性,它可以非常方便的定制和配置缓存缓存可以极大的提高查询效率 MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存 默认情况下,只有一级缓存开启(SqlSession级别的缓存,也称为本地缓存) 二级缓存需要手动开启和配置,他是基于namespace 为了提高可扩展性,MyBatis定义了缓存接口Cache。我们可以通过实现Cache接口来定义二级缓存。 ###一级缓存 一级缓存也叫本地缓存: 与数据库同一次会话期间查询到的数据会放在本地缓存汇总 以后如果还需要获取相同数据,直接从缓存中取,没必要再去查询数据库 测试步骤: 开启日志 测试一个 ###二级缓存 二级缓存也叫全局缓存,一级缓存的作用域太低了,所以诞生了二级缓存 基于namespace级别的缓存,一个名称空间,对应一个二级缓存 工作机制 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存

    31220发布于 2021-10-19
  • Mybatis学习:Mybatis缓存配置

    MyBatis缓存配置数据库 一级缓存、二级缓存、三级缓存 一级缓存:在维持一个会话时,查询获取的数据会存放在一级缓存中,下次使用从缓存中获取。 (查询缓存 如redis)二级缓存的使用场景: 1.以查询为主的应用,尽可能少的增、删、改操作; 2.业务以单表操作为主; 3.表与表之间的关联尽可能少;MyBatis如何配置二级缓存第一步: 在mybatis-config.xml 由于Mybatis在每一对象映射配置单独选择缓存策略, 所以分为2种 Mapper.xml 或者 在接口中使用注解 Mapper.xmlini 代码解读复制代码<cacheeviction="FIFO :存取<em>缓存</em>使用了序列化和反序列 所以实体类要实现Serializable接口 第一步:添加项目依赖xml 代码解读复制代码<dependency><groupId>org.<em>mybatis</em>.caches< /groudId><artifactId><em>mybatis</em>-redis</artifactId><version>1.0.0-beta2</version></dependency>第二步:配置redis

    51010编辑于 2025-01-07
  • mybatis缓存详解

    mybatis缓存 mybatis的一级缓存是Session级别的缓存。一级缓存的作用域默认是一个SqlSession。Mybatis默认开启一级缓存。 jobLogsById = sysQuartzJobLogMapper1.getJobLogsById(new Page<>(1, 10), "23dedbb5-af24-11ec-a42d-0894ef72d9c4 MyBatis的一级缓存是基于SqlSession来实现的,对应MyBatis中sqlSession接口的默认实现类是DefaultSqlSession,如果执行的SQL相同时,并且使用的是同一个SqlSession 但是在Spring整合MyBatis后,Spring使用MyBatis不再是直接调用MyBatis中的信息,而是通过调用调用mybatis-spring.jar中的类,继而达到间接调用MyBatis的效果 mybatis的二级缓存,针对的是mapper,或者也可以说是sqlFactory 首先说一下他的配置 在配置文件中加入这句话 mybatis-plus.configuration.cache-enabled

    38410编辑于 2025-05-30
  • 来自专栏Java开发者之家

    Mybatis缓存机制

    使用sqlSession工厂,获取到sqlSession对象使用他来执行增删改查 * 一个sqlSession就是代表和数据库的一次会话,用完关闭 * 3)、使用sql的唯一标志来告诉MyBatis * * @throws IOException # Mybatis缓存机制 /** * 两级缓存: * 一级缓存:(本地缓存):sqlSession级别的缓存,一级缓存是一直开启的;sqlSession flushInterval:缓存刷新时间 缓存多长时间清空一次,默认不清空,设置一个毫秒值 readOnly:是否只读 true:只读:mybatis认为所有从缓存中获取数据的操作都是只读操作 ,不会修改数据 mybatis为了加快获取速度,直接就会将数据在缓存中引用交给用户。 不安全,速度快 false:非只读,mybatis觉得获取的数据可能会被修改 mybatis会利用序列化&反序列的技术克隆一份新的数据给你。

    81120发布于 2021-06-17
  • 来自专栏兜兜毛毛

    MyBatis 缓存(5)

    MyBatis有必要使用缓存吗?为什么? 一般的ORM框架都会提供缓存功能来提升查询效率、减少数据库的压力。 跟Hibernate一样,Mybatis也有一级缓存、二级缓存,并预留了集成第三方的缓存接口。 除了基础缓存之外,MyBatis也定义了很多装饰器,同样实现了Cache接口,通过这些装饰器可以额外实现很多功能。 ? 所有缓存可以分为三大类:基本缓存、淘汰算法缓存、装饰器缓存MyBatis缓存默认是开启的,不需要任何配置(localCacheScope=STATEMENT相当于关闭一级缓存)。 如果启用了二级缓存MyBatis在创建Executor的时候会对Executor进行装饰。

    66420发布于 2021-04-19
  • 来自专栏Java实战博客

    Mybatis 缓存问题

    Mybatis 调用过程解读 每次与数据库的连接都会优先走缓存中查找! 先查询二级缓存,再去查询一级缓存,都没有命中才会去查询数据库 二级缓存是以配置文件 <namespace>为单位的开启的,是在SqlSession 共享的,容易出现赃读、脏写,不建议使用!!! 一级缓存是SqlSession独享的,默认开启,建议开启 什么是一级缓存? (默认开启) 当我们连续通过Mybatis 查询同一条Sql的时候两次,在短时间内,只会在第一次查询时会走SQL,第二次查询,就不会出现连接数据库(Opening JDBC Connection)查询的问题了 第二次使用的是 一级缓存! 什么是二级缓存?(默认不开启) 如何开启呢?在mapper.xml 添加<catch> </catch> 缓存陷井?

    57010编辑于 2022-01-19
  • 来自专栏软件工程

    Mybatis缓存

    Mybatis缓存体系图 Mybatis缓存的基础实现是perpetualCache,但是mybatis利用装饰者模式对基础cache提供了许多的增强功能,比如上图,BlockingCache 实际上我们的二级缓存还是利用的装饰者模式做了一个包装类cachingExecutor对一级缓存做了增强,如果启用了 二级缓存MyBatis 在创建 Executor 对象的时候会对 Executor 第三方缓存做二级缓存 除了 MyBatis 自带的二级缓存之外,我们也可以通过实现 Cache 接口来自定义二级 缓存MyBatis 官方提供了一些第三方缓存集成方式,比如 ehcache 和 redis: https://github.com/mybatis/redis-cache pom 文件引入依赖 1.pom ,不使用 MyBatis 自带的二级缓存

    39910编辑于 2022-01-12
  • 来自专栏Java开发

    Mybatis缓存配置

    开启缓存: <settings> <! -- 开启二级缓存 --> <cache type="org.<em>mybatis</em>.caches.ehcache.EhcacheCache"> <property name="timeToIdleSeconds </select> useCache="false"表示该select语句不使用缓存(即使xml最开头的全局cache启用) 默认情况下,如果全局开启了缓存,insert/update/delete 成功后,会自动刷新相关的缓存项,但有一点要特别注意:在mybatis与hibernate混用时,由于mybatis与hibernate的缓存是无关的,如果用mybatis做select查询,用hibernate 做insert/update/delete,hibernate对数据的修改,并不会刷新mybatis缓存

    92020发布于 2018-09-06
  • 来自专栏java学习java

    MyBatis缓存

    1、MyBatis的一级缓存 一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就 会从缓存中直接获取,不会从数据库重新访问 使一级缓存失效的四种情况 两次查询期间手动清空了缓存 2、MyBatis的二级缓存 二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被 缓存;此后若再次执行相同的查询语句 false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是false。 MyBatis缓存查询的顺序 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。 如果二级缓存没有命中,再查询一级缓存 如果一级缓存也没有命中,则查询数据库 SqlSession关闭之后,一级缓存中的数据会写入二级缓存

    31740编辑于 2022-11-13
  • 来自专栏OSChina

    Mybatis缓存

    1 Mybatis缓存: 2 Mybatis的一级缓存 : 3 Mybatis的二级缓存 二级缓存的参数配置 mybatis整合ehcache ehcache.xml文件: <ehcache xmlns -- name:缓存名称。 maxElementsInMemory:缓存最大个数。 diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。 maxElementsOnDisk:硬盘最大缓存个数。 diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine.

    61510发布于 2019-07-31
  • 来自专栏Java编程技术

    Mybatis缓存揭秘

    p6,p7,p8等上不封顶级别,有意向的可以发简历给我,注明想去的部门和工作地点:1064454834@qq.com 欢迎关注微信公众号:技术原始积累 获取更多技术干货 一、前言 因为在做项目时候遇到了mybatis Mybatis的一级缓存是SqlSession级别的,我们知道每个mapper接口对应一个SqlSession(这样说应该不准确,应该是一个线程中一个mapper接口对应一个sqlsession),所以 Mybatis的一级缓存在不同mapper之间是隔离,相互不影响的。 clearLocalCache(); return doUpdate(ms, parameter); } 由于默认情况下mybatis开启一级缓存,所以如果你需要每次查询都从数据库查询 四、Mybatis二级缓存 4.1介绍 二级缓存是namespace级别的,这个namespace就是指mapper文件里面那个namepsace,同一个namespace下的搜寻语句共享一个二级缓存

    1.1K20发布于 2018-09-06
  • 来自专栏全栈程序员必看

    浅谈 MyBatis 缓存

    1、一级缓存 MyBatis 默认开启了一级缓存,一级缓存是在 SqlSession 层面进行缓存的。 在 MyBatis-config.xml 文件中添加 <setting name="cacheEnabled" value="true"/> 在 xxxMapper.xml 文件中添加 <cache eviction true(只读):MyBatis 认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。MyBatis 为了加快获取数据,直接就会将数据在缓存中的引用交给用户 。不安全,速度快。 false(读写,默认):MyBatis 觉得获取的数据可能会被修改,MyBatis 会利用序列化或反序列化的技术克隆一份新的数据。安全,速度相对慢。 size:缓存存放多少个元素。 在 xxxMapper.xml 文件中进行配置 <cache type="org.<em>MyBatis</em>.caches.ehcache.EhcacheCache"/> 如果在其他的 xxxMapper.xml

    42600编辑于 2022-08-31
  • 来自专栏狗哥的 Java 世界

    mybatis 缓存机制

    mybatis支持一、二级缓存来提高查询效率,能够正确的使用缓存的前提是熟悉mybatis缓存实现原理; 众所周知,mybatis的sqlSession封装了对数据库的增删改查操作,但是每个SqlSession 我们发现BaseExecutor和CachingExecutor实现了Executor接口,BaseExecutor是一个抽象类,它有三个子类(实际上还有一个ClosedExecutor) 一级缓存 mybatis 二、缓存失效的时机 可以看到清除缓存是在doUpdate(真正的更新操作)操作之前执行的,也就是说doUpdate执行成功或失败、提交或者回滚 缓存都会失效; 小结 MyBatis一级缓存使用没有容量限制的 HashMap,比较简陋; statement级别的缓存每一次查询后清除; session级别缓存在同一个SqlSession的insert、update、delete操作之前清除; MyBatis的一级缓存最大是同一个 由于是基于namespace的缓存,如果存在多表查询,可能存在数据更新之后此namespace下的缓存还没有失效,也会产生脏数据; 总的来说,如果不熟悉mybatis缓存机制,最好是使用第三方缓存

    82010发布于 2019-10-17
  • 来自专栏全栈程序员必看

    mybatis缓存配置

    mybatis缓存有三种方式: 1、一级缓存(基于SqlSession会话级别的; 2、二级缓存(基于nameSpace级别的,范围比以及缓存更广); 3、第三方缓存mybatis缓存使示意图 : 一、一级缓存说明: 其中一级缓存mybatis默认使用的缓存,无需手动配置,二级缓存需要手动配置; 一级缓存失效条件 1)sqlSession不同,由于一级缓存是基于sqlSession 相同,查询条件不同; 二、二级缓存相关配置: 步骤如下: 1)、开启缓存mybatis配置文件中设置启用缓存 <settings> <setting name="cacheEnabled 三、<em>mybatis</em><em>缓存</em>相关属性设置: 在XXmapper.xml配置文件的各个增删改查节点中可以设置以下属性控制<em>缓存</em>; useCache:默认为true,当设置false时,则不使用二级<em>缓存</em>(对一级<em>缓存</em>没有影响 , 数据查询的时候会先查询二级<em>缓存</em>,再查询一级<em>缓存</em>,最后查询数据库; 四、第三方<em>缓存</em>配置: <em>Mybatis</em>自身的<em>缓存</em>其实是很简陋的,其顶层接口为Cache,查看其具体实现,底层其实就是个Map数据结构而已

    78630编辑于 2022-08-31
  • 来自专栏云霄雨霁

    Mybatis--缓存

    两级缓存: 一级缓存:(本地缓存) sqlSession级别的缓存,一级缓存一直是开启的 与数据库的同一次绘画期间查询到的数据会放在本地缓存中,以后如果需要获取相同的数据,直接从缓存中获取,不必再去查询数据库 namespace对应一个二级缓存 工作机制: 1、一个会话,查询一条数据,这条数据就会被放在当前会话的一级缓存中 2、如果会话关闭,一级缓存中的数据会被保存在二级缓存中;新的会话查询信息就可以参照二级缓存 只读的话:mybatis认为该操作不会改变数据,为了加快数据会直接将数据在缓存中的引用交给用户。 =true/false: 开启/关闭缓存(二级缓存,一级缓存一直存在) 2、<select>中 useCache="false": 不使用缓存(二级缓存,一级缓存依然使用) 3、每个增删改标签 flashCache session的一级缓存,和二级缓存没关系 6、localCacheScope:影响一级缓存

    79600发布于 2018-05-30
  • 来自专栏小工匠聊架构

    MyBatis-22MyBatis缓存配置【一级缓存

    文章目录 概述 一级缓存 ? 概述 使用缓存可以使应用更快的获取数据,避免频繁的数据库交互,尤其是在查询越多、缓存命中率越高的情况下,使用缓存的作用就越明显。 MyBatis作为持久化框架,提供了非常强大的查询缓存特性,可以非常方便的配置和定制使用。 一般提到MyBatis缓存,都是指二级缓存。 一级缓存(也叫本地缓存)默认会启用,并且不能控制,因此很少提到, 这里仅仅是介绍下一级缓存,了解一级缓存可以避免产生一些难以发现的错误。 作为了解即可。 ---- 一级缓存 话不多少,直接上代码演示一级缓存如何起作用的 package com.artisan.mybatis.xml.mapper; import org.apache.ibatis.session.SqlSession MyBatis的一级缓存存在于SqlSession的生命周期中,在同一个sqlSession中查询时,MyBatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果一起放入Map对象中。

    51430发布于 2021-08-17
领券