二级缓存

Mybaits 源码解析 (九)----- 一级缓存和二级缓存源码分析

爷,独闯天下 提交于 2019-11-27 02:59:51
像Mybatis、Hibernate这样的ORM框架,封装了JDBC的大部分操作,极大的简化了我们对数据库的操作。 在实际项目中,我们发现在一个事务中查询同样的语句两次的时候,第二次没有进行数据库查询,直接返回了结果,实际这种情况我们就可以称为缓存。 Mybatis的缓存级别 一级缓存 MyBatis的一级查询缓存(也叫作本地缓存)是基于org.apache.ibatis.cache.impl.PerpetualCache 类的 HashMap本地缓存,其作用域是SqlSession,myBatis 默认一级查询缓存是开启状态,且不能关闭。 在同一个SqlSession中两次执行相同的 sql查询语句,第一次执行完毕后,会将查询结果写入到缓存中,第二次会从缓存中直接获取数据,而不再到数据库中进行查询,这样就减少了数据库的访问,从而提高查询效率。 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,PerpetualCache 对象是在SqlSession中的Executor的localcache属性当中存放,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。 二级缓存 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为

hibernate缓存:一级缓存和二级缓存

≡放荡痞女 提交于 2019-11-27 02:59:28
1.什么是缓存?  缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能。 Hibernate 在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据 ( 我们把这称做 “ 缓存命 中 ") ,则就直接把命中的数据作为结果加以利用,避免了大量发送 SQL 语句到数据库查询的性能损耗。 缓存策略提供商: 提供了 HashTable 缓存, EHCache , OSCache , SwarmCache , jBoss Cathe2 ,这些缓存机制,其中 EHCache , OSCache 是不能用于集群环境( Cluster Safe )的,而 SwarmCache , jBoss Cathe2 是可以的。 HashTable 缓存主要是用来测试的,只能把对象放在内存中, EHCache , OSCache 可以把对象放在内存( memory )中,也可以把对象放在硬盘( disk )上( 为什么放到硬盘上?上面解释了)。 Hibernate 缓存分类: 一、 Session 缓存(又称作事务缓存): Hibernate 内置的,不能卸除。 缓存范围:缓存只能被当前 Session 对象访问。缓存的生命周期依赖于 Session 的生命周期,当

延迟加载,一级缓存,二级缓存

这一生的挚爱 提交于 2019-11-27 02:59:01
---恢复内容开始--- 概念: MyBatis中的延迟加载,也称为懒加载,是指在进行表的 关联查询 时,按照设置延迟规则推迟对关联对象的 select查询。例如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力。MyBatis 的延迟加载 只是对关联对象的查询有迟延设置 , 对于主加载对象都是直接执行查询语句的。 加载时机: 直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。 侵入式延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情属性时,就会马上执行关联对象的 select查询。 深度延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的 select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。 注意:延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的 select 语句,不能是使用多表连接所进行的 select 查询。因为,多表连接查询,实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。 侵入式延迟加载配置方法: Mybatis-config.xml 大配置文件

开启redis二级缓存和注意事项(类不匹配问题)

北战南征 提交于 2019-11-27 02:16:25
导入redis相关的jar包 <!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 重写cache文件,代码如下,保存在com.xx.cache下 package com.baizhi.cache; import org.apache.commons.lang3.SerializationUtils; import org.apache.ibatis.cache.Cache; import org.apache.ibatis.cache.CacheException; import redis.clients.jedis.Jedis; import

Hibernate缓存

天涯浪子 提交于 2019-11-26 22:47:46
Hibernate缓存   缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用的运行性能。Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做“缓存命中"),则就直接把命中的数据作为结果加以利用,避免了大量发送SQL语句到数据库查询的性能损耗。 Hibernate缓存分类: 一、Session缓存(又称作事务缓存):Hibernate内置的,不能卸除。 缓存范围:缓存只能被当前Session对象访问。缓存的生命周期依赖于Session的生命周期,当Session被关闭后,缓存也就结束生命周期。 二、SessionFactory缓存(又称作应用缓存):使用第三方插件,可插拔。 缓存范围:缓存被应用范围内的所有session共享。这些session有可能是并发访问缓存,因此必须对缓存进行更新。缓存的生命周期依赖于应用的生命周期,应用结束时,缓存也就结束了生命周期,二级缓存存在于应用程序范围。 Hibernate一些与一级缓存相关的操作(时间点): 数据放入缓存: 1. save()。当session对象调用save()方法保存一个对象后,该对象会被放入到session的缓存中。 2. get()和load()

hibernate之二级缓存

倾然丶 夕夏残阳落幕 提交于 2019-11-26 22:22:11
为什么需要缓存?   使用缓存,是需要对应用系统进行性能优化而常采用的一种重要手段。合理地运用缓存,可以极大的提高应用系统的运行效率。 Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存。它可以缓存整个应用的持久化对象,所以又称为“SessionFactory缓存”。 hibernate二级缓存中的缓存对象可以被整个应用的 Session对象 共享,即使关闭当前 Session对象 ,新建的 Session对象 仍可使用。使用Hibernate的二级缓存之后查询数据,Session对象会首先在以及缓存中查找有无缓存数据被命中。如果没有,则查找二级缓存。如果有,则直接返回所命中的数据;否则查询数据库。 关系型数据库:数据与数据之间存在关系(联系)的数据库 mysql/Oracle、sqlserver 非关系型数据库:数据与数据之间是不存在关系的,key-value 1、基于文件存储的数据库:ehcache 2、基于内存存储的数据库:redis、memcache 3、基于文档存储的数据库:mongodb 4. ehcache的特点   4.1 够快     Ehcache的发行有一段时长了,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems.   4.2 够简单    

hibernate之二级缓存

感情迁移 提交于 2019-11-26 21:14:01
1. 为什么需要缓存 拉高程序的性能 关系型数据库:数据与数据之间存在关系(联系)的数据库 mysql/Oracle、sqlserver 非关系型数据库:数据与数据之间是不存在关系的,key-value 1、基于文件存储的数据库:ehcache 2、基于内存存储的数据库:redis、memcache 3、基于文档存储的数据库:mongodb 4. ehcache的特点 4.1 够快 Ehcache的发行有一段时长了,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems. 4.2 够简单 开发者提供的接口非常简单明了,从Ehcache的搭建到运用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目 4.3 够袖珍 关于这点的特性,官方给了一个很可爱的名字small foot print ,一般Ehcache的发布版本不会到2M,V 2.2.3 才 668KB。 4.4 够轻量 核心程序仅仅依赖slf4j这一个包,没有之一! 4.5 好扩展 Ehcache提供了对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多 4.6 监听器 缓存管理器监听器

hibernate--二级缓存

送分小仙女□ 提交于 2019-11-26 21:12:34
hibernate之二级缓存 1. 为什么需要缓存? 其实就是拉高程序的性能 2. 什么样的数据需要缓存? 很少被修改或根本不改的数据 数据字典 业务场景比如:耗时较高的统计分析sql、电话账单查询sql等 3. ehcache是什么? Ehcache 是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大 注:本章介绍的是2.X版本,3.x的版本和2.x的版本API差异比较大 4. ehcache的特点 4.1 够快 Ehcache的发行有一段时长了,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems. 4.2 够简单 开发者提供的接口非常简单明了,从Ehcache的搭建到运用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目 4.3 够袖珍 关于这点的特性,官方给了一个很可爱的名字small foot print ,一般Ehcache的发布版本不会到2M,V 2.2.3 才 668KB。 4.4 够轻量 核心程序仅仅依赖slf4j这一个包,没有之一! 4.5 好扩展 Ehcache提供了对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多 4

Hibernate之二级缓存

我只是一个虾纸丫 提交于 2019-11-26 21:00:32
1.为什么需要缓存 原因: 用缓存,主要有两个用途:高性能、高并发。 高性能 非实时变化的数据-查询mysql耗时需要300ms,存到缓存redis,每次查询仅仅1ms,性能瞬间提升百倍。 高并发 mysql 单机支撑到2K QPS就容易报警了,如果系统中高峰时期1s请求1万,仅单机mysql是支撑不了的,但是使用缓存的话,单机支撑的并发量轻松1s几万~十几万。 原因是缓存位于内存,内存对高并发的良好支持。 2. 什么样的数据需要缓存 很少被修改或根本不改的数据 数据字典 业务场景比如:耗时较高的统计分析sql、电话账单查询sql等 3. ehcache是什么 Ehcache 是现在最流行的纯Java开源缓存框架,配置简单、结构清晰、功能强大 注1:本章介绍的是2.X版本,3.x的版本和2.x的版本API差异比较大 4. ehcache的特点 够快 Ehcache的发行有一段时长了,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems. 够简单 开发者提供的接口非常简单明了,从Ehcache的搭建到运用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目 够袖珍 关于这点的特性,官方给了一个很可爱的名字small foot print

mybatis源码分析之SqlSession的创建过程

旧城冷巷雨未停 提交于 2019-11-26 20:54:56
mybatis之SqlSessionFactory mybatis源码分析之Configuration mybatis源码分析之事务管理器 以上是之前的分析,在 mybatis源码分析之事务管理器 里分析到了事务管理器 SqlSession session = sqlSessionFactory.openSession(); //DefaultSqlSessionFactory里的openSession public SqlSession openSession() { return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false); } private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Transaction tx = null; try { //根据配置获取环境 final Environment environment = configuration.getEnvironment(); //构建事务工厂 final TransactionFactory