三级缓存

Spring如何解决循环依赖,你真的懂了?

对着背影说爱祢 提交于 2020-04-07 20:58:08
导读 前几天发表的文章 SpringBoot多数据源动态切换 和 SpringBoot整合多数据源的巨坑 中,提到了一个坑就是动态数据源添加@Primary接口就会造成循环依赖异常,如下图: 这个就是典型的构造器依赖,详情请看上面两篇文章,这里不再详细赘述了。本篇文章将会从源码深入解析Spring是如何解决循环依赖的?为什么不能解决构造器的循环依赖? 什么是循环依赖 简单的说就是A依赖B,B依赖C,C依赖A这样就构成了循环依赖。 循环依赖分为构造器依赖和属性依赖,众所周知的是Spring能够解决属性的循环依赖(set注入)。下文将从源码角度分析Spring是如何解决属性的循环依赖。 思路 如何解决循环依赖,Spring主要的思路就是依据三级缓存,在实例化A时调用doGetBean,发现A依赖的B的实例,此时调用doGetBean去实例B,实例化的B的时候发现又依赖A,如果不解决这个循环依赖的话此时的doGetBean将会无限循环下去,导致内存溢出,程序奔溃。spring引用了一个早期对象,并且把这个"早期引用"并将其注入到容器中,让B先完成实例化,此时A就获取B的引用,完成实例化。 三级缓存 Spring能够轻松的解决属性的循环依赖正式用到了三级缓存,在 AbstractBeanFactory 中有详细的注释。 /**一级缓存,用于存放完全初始化好的 bean,从该缓存中取出的

寄存器vs缓存vs硬盘

喜欢而已 提交于 2019-12-02 04:43:11
如下配置:一个处理器cpu,六个核。处理器速度为2.2GHz即电流每秒钟可以振荡22亿次。二级缓存256KB,每个核都独自有一个二级缓存;三级缓存9M,是六个核共享的。使用了超线程技术,所以总共有十二个核,即十二个线程 来源: https://www.cnblogs.com/shengulong/p/11730226.html

Hibernate缓存策略详解

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