- 博客(58)
- 资源 (2)
- 收藏
- 关注
原创 问题排查记录:A component required a bean of type ‘java.util.List‘ that could not be found.
代码中打印异常堆栈的位置如下图所示,使用的apache-commons-logging打日志,所以将这个logger打印的日志级别配置成DEBUG级别,也可以打印详细信息,帮助排查问题。如果这种方式没搜到,那只能根据控制台日志来看了。全局搜索这个类,这个类是Spring框架的一个类,翻它的源码可以看到下面的代码。解决的方法其实不难,只是仅凭这个报错信息不好直接定位到问题出在哪里,下面我总结一下找到问题根源的几种方式。所以我尝试把断点打在这两个地方,再运行代码,根据断点的信息,已经足够定位问题出现的位置了。
2024-11-26 22:23:56 526
原创 SQL优化 - group by优化
• 索引的任何其它部分(除了那些来自查询中引用的GROUP BY)必须为常数(也就是说,必须按常量数量来引用它们),但MIN()或MAX() 函数的参数例外。• GROUP BY包括索引的第1个连续部分(如果对于GROUP BY,查询有一个DISTINCT子句,则所有DISTINCT的属性指向索引开头)。同时,临时表的使用是否可以用索引访问代替,还取决于查询中使用了索引的哪些部分、为这些部分指定的条件以及所选的聚合函数。• 如果使用聚集函数,只能使用MIN()和MAX(),并且它们均指向相同的列。
2024-11-05 10:01:22 423
原创 Java基础知识总结
Java 的位运算是对整数类型的二进制位进行操作的运算,操作数只能是 int 和 long 类型,以及通过类型提升支持的 byte、short 和 char 类型。示例:-8 >> 1(11111000 右移 1 位)结果为 -4(11111100)示例:5 >>):将位向右移动指定的位数,左侧补零,不管符号位。按位或(|):对应位至少有一个为 1 时结果为 1,否则为 0。按位与(&):对应位都为 1 时结果为 1,否则为 0。
2024-11-03 20:15:47 283
原创 算法刷题基础知识总结
换句话说,如果一个整数 𝑎 被另一个整数 𝑏 除,且结果是一个整数(没有余数),那么 𝑏 就是 𝑎 的因数。根据互为质数可以得到,质数的最大公约数是一,那么用哈希表保存各个因数的累计值,除了1以外的因数,其他存在大于1的数,则不互为质数。互质(又称为 质数 或 互为质数)是指两个或多个整数之间的一种关系:如果它们的最大公约数(GCD)是 1,则称这些整数互质。(6)两个数中的较小一个是质数,而较大数是合数且不是较小数的倍数,这两个数一定是互质数。(5)两个数中的较大一个是质数,这两个数一定是互质数。
2024-10-26 23:09:33 795
原创 InnoDB自增处理
InnoDB提供了一种可配置的锁机制,可以显著提高向具有自增列的表添加行的SQL语句的可扩展性和性能。要将自增机制用于InnoDB表,必须将AUTO_INCREMENT列定义为某个索引的第一列或唯一的一列,以便可以在表上执行类似查询的等效操作来获得自增列当前的最大列值,这里ai_col就是自增的那一列。索引可以不是或UNIQUE,但为了避免列中的重复值,建议使用这些索引类型。
2024-10-20 21:50:27 664
原创 SQL优化 - Limit优化
如果要进行filesort,则在找到row_count行之前,所有不带LIMIT子句能查出来的行都会被查询,并对其中大部分或全部行进行排序。为了避免这种情况,可以在 SQL 查询语句中使用唯一的排序字段来进行排序,或者在 SQL 查询语句中增加一个唯一的排序条件,例如使用 id 字段进行排序,这样可以确保每条记录在排序后都是唯一的。如果ORDER BY排序字段存在重复值,那么结果的顺序可能是不同的,也就是说在分页查询中可能会出现多页出现同一条数据的情况,数据重复。的方式来指定要查询的记录范围。
2024-10-18 00:33:21 770
原创 Java并发 - 线程池
为什么 Worker 要实现AQS?这点在Woker类的注释上有说明:因为是要一个不能重入的互斥锁,setCorePoolSize 时通过 interruptIdleWorkers 实现减少当前的Worker功能,如果锁是可以重入的,那么可能会中断当前正在执行的Worker。
2024-10-15 12:06:19 1060
原创 Java并发 - CAS
CAS意为Compare and Swap(比较并交换),是设计并发算法时使用的一种技术。基本上,CAS将变量值与预期值进行比较,如果值相等,则将变量值交换为新值。没有锁的状态下可以保证多个线程对同一个值的更新的线程一致性。
2024-10-13 18:11:48 992
原创 Java并发 - AQS之Semaphore
ReentrantLock会调用acquireQueued(互斥),而Semaphore调用acquireShared(共享)ReentrantLock的节点是互斥模式Node.EXCLUSIVE,Semaphore是共享模式Node.SHAREDSemaphore支持中断,ReentrantLock只有调用才支持中断状态切换图。
2024-10-13 16:10:22 747
原创 Java并发 - AQS之ReentrantLock
是JUC里提供的一个抽象类,维护了当前获取锁的线程/**/**一般使用的是其子类 AbstractQueuedSynchronizer,这个才是 AQS 本身java.util.concurrent.locks.AbstractQueuedSynchronizer 基于模板方法设计模式,/***//***//***/
2024-10-12 21:12:45 1009
原创 Java并发 - 阻塞队列
继承自BlockingQueue,BlockingQueue 的双端队列版本,支持在队列的两端进行插入和提取操作,并且这些操作都是阻塞的。LinkedTransferQueue 是 TransferQueue 的一个常用实现,采用链表结构,允许无界的队列操作,也没有数组实现版本。支持优先级的无界阻塞队列。无缓冲区:由于不存储元素,它实际上是一个直接交付的队列,插入和提取操作是通过手动的线程交互进行的。使用链表实现,可以是有界的或无界的。,它是基于链表的无界双端阻塞队列,JDK 中没有基于数组的实现版本。
2024-10-12 02:17:21 595
原创 零拷贝数据传输
零拷贝可以避免中间缓冲区之间的冗余数据拷贝,并减少用户空间和内核空间之间的上下文切换次数。当硬件(磁盘驱动器、网卡、图形卡、声卡)支持DMA(直接内存访问)时,理想的零拷贝(零CPU拷贝)是可能的。
2024-10-11 06:44:00 816
原创 Spring 系列 - 事务管理
其实所谓的加入一个事务就是指的使用同一个数据库连接,所以 handleExistingTransaction 这个方法里,其实针对加入的情况下有一些待加入事务和已存在事务的兼容性方面的判断。根据 AOP 的原理它是肯定要有一个 Advice 的,所以我们直接看具体的拦截器类型就可以知道事务执行流程里方法是怎么调用的,如下图所示。下面模拟一个转账操作。REQUIRES_NEW:如果一个事务被嵌套在另一个事务中并且使用了 REQUIRES_NEW,外部事务可能会在内部事务完成之前提交。
2024-10-11 00:35:17 1069
原创 Spring系列 - 循环依赖
最后调用了 addSingleton 方法,此方法的内容就是将 createBean 创建的对象放入 singletonObjects 这个缓存中,并且从 singletonFactories 和 earlySingletonObjects 这两个缓存中移除当前创建的这个 beanName。那么执行 doGetBean 方法时直接从而及缓存中就可以获取到,直接就返回了,就没有后续的那么多操作了。没有构造函数依赖的情况下,会默认通过无参构造创建,先创建这个对象,然后进行相关依赖属性的填充。
2024-10-09 17:14:28 1190
原创 Spring系列 Bean的生命周期
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean 方法实现获取Bean的全部逻辑。利用BeanFactory#resolveDependency获取依赖的Bean对象,实际上也是调用getBean去获取依赖的对象。一般来说用户定义的Bean初始化时机是在 Spring 上下文刷新的最后才进行的,如下图所示。单例创建之前的一个回调方法,将要创建的beanName加入到。将当前的正在创建的beanName移除。
2024-10-08 23:55:05 1031
原创 OpenFeign 工作原理源码记录
通过上面的分析,@EnableFeignClients 的所有配置就清楚了value,basePackages,basePackageClasses用于指定包扫描路径defaultConfiguration 用于作为 FeignClientSpecification 这个Bean的参数clients:用于手动指定@FeignClient实例,不为空则不进行@FeignClient类扫描启动过程中会注册两类 Bean 定义信息(注意是Bean定义)
2024-10-08 17:22:20 1276
原创 RabbitMQ 集群
实际上,RabbitMQ主从之间的数据复制是异步的,但是在rabbitmq中不会出现mysql那种丢数据的情况,这是因为rabbitmq的接口也是异步的,主收到一条消息写入本地存储,然后在发起写入从的请求。rabbitmq的接口本身就是异步的接口,所以rabbitmq的主从复制就自然而然的是异步的方式。引入镜像队列(Mirror Queue)的机制,可以将队列镜像到集群中的其他 Broker 节点之上,如果集群中 的一个节点失效了,队列能自动地切换到镜像中的另一个节点上以保证服务的可用性。
2024-10-07 01:51:57 1141
原创 MySQL 日志 - Binlog
binlog 全称 BinaryLog,是 MySQL 数据库中用于记录所有更改数据库状态的事件的日志文件。binlog 的特点。
2024-10-06 07:21:22 919
原创 InnoDB 磁盘结构 - RedoLog
RedoLog 是MySQL的一种日志文件,用于在崩溃恢复期间纠正由不完整事务写入的数据。在崩溃恢复期间,数据库只需要重放从最后一个检查点开始的日志记录,而不是从头开始重放所有日志记录,从而加快恢复速度。MySQL写 RedoLog 时是往 LogBuffer 里面写,LogBuffer 是一块保存要写入构成RedoLog的日志文件的数据的内存区域。MySQL利用 Redo Log 进行恢复的核心思想是在系统崩溃后,通过重放Redo Log中记录的操作,将数据库恢复到崩溃前的状态,从而保证了事务的持久性。
2024-10-06 06:44:38 1063
原创 InnoDB 事务模型
如果一个事务(事务A)插入或修改某些行然后提交该事务,则从另一个并发 REPEATABLE READ 事务(事务B)的 DELETE 或 UPDATE 操作可能会影响那些刚刚提交的行,即使会话无法查询它们(因为会话B也是读自己的快照,所以看不到会话A新增的一行)。即当我们某个事务执行快照读的时候,对该记录创建一个 Read View 读视图,把它比作条件用来判断当前事务能够看到哪个版本的数据,既可能是当前最新的数据,也有可能是该行记录的undo log里面的某个版本的数据。大事务来回查一个数据。
2024-10-05 21:30:33 693
原创 MySQL 查询优化器
对于连接查询,MySQL优化器调查的可能计划的数量随着查询中引用的表的数量呈指数级增长。与相应内存参数(memory_temptable_create_cost、memory_tmptable_row_cost)的默认值相比,这些磁盘参数的默认值较大,因为处理基于磁盘的表的成本较高。与相应磁盘参数的默认值(disk_temptable_create_cost, disk_temptable_row_cost)相比,这些内存参数的默认值较小,这反映了处理基于内存的表的成本较低。此成本项适用的存储引擎的名称。
2024-10-04 18:46:54 941
原创 SQL优化 - 排序
如果索引不完全包含查询的所有列,需要回表的话,则需要WHERE子句的选择性足以使索引范围扫描比表扫描成本更低,则优化器会选择使用索引。如果ORDER BY操作使用了索引,那么就可以避免排序操作,因为索引本身就是按索引 key 排好序的。增量分配的这种方式可以在小排序发生时不会占用过多的内存。在这种情况下,扫描整个索引并查找表行以查找不在索引中的列可能比扫描表并对结果进行排序成本更高,因此优化器可能不会使用索引。如果ORDER BY不满足用索引的条件,MySQL将执行文件排序操作,读取表的行并对其进行排序。
2024-10-04 15:18:48 680
原创 Spring注解系列 - @Autowired注解
Autowired注解可以自动将所需的依赖对象注入到类的属性、构造方法或方法中,从而减少手动注入依赖的代码,并提高代码的可维护性和可测试性。它是Spring容器配置的一个重要注解,与@Required、@Primary、@Qualifier等注解同属容器配置范畴。@Autowired是按照类型注入依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照Bean的名称来装配,可以结合@Qualifier注解一起使用。
2024-10-02 18:53:01 1446
原创 Spring系列 BeanPostProcessor
本文源码基于spring-beans-5.3.31BeanPostProcessor 是 Spring 框架中的一个接口,用于在 bean 实例化和初始化过程中进行一些回调处理,可以对Bean进行一些扩展或修改。
2024-09-30 19:10:07 969
原创 Spring注解系列 - @Import注解
大致流程如下图所示这三种方式都围绕ConfigurationClassParser#parse方法,用于解析配置类,获取配置类的所有可能配置的BeanDefinition,后续将其注册Bean到容器种简单总结一下三种方式的区别:执行时机。
2024-09-30 06:44:32 817
原创 MySQL存储引擎对比
MySQL中常用的四种存储引擎分别是: MyISAM、InnoDB、MEMORY、ARCHIVE。MySQL 5.5版本后默认的存储引擎为InnoDB。
2024-09-30 01:05:53 436
原创 InnoDB 死锁
死锁是指多个事务无法继续进行的情况,因为每个事务都持有另一个事务所需的锁。因为所有涉及的事务都在等待同一资源可用,所以它们都不会释放它所持有的锁。当事务锁定多个表中的行时(通过UPDATE或等语句),可能会发生死锁,但顺序相反。当此类语句锁定索引记录和间隙的范围时,也可能发生死锁,由于时间问题,每个事务都会获得一些锁,但不会获得其他锁。关于死锁示例,请参阅第17.7.5.1节“InnoDB死锁示例死锁的可能性不受隔离级别的影响,因为隔离级别只会改变读取操作的行为,而死锁是由于写入操作而发生的。
2024-09-29 23:39:53 786
原创 InnoDB索引结构
索引页的默认大小为16KB。当新记录插入到InnoDB聚集索引中时,InnoDB会尝试留出1/16的页空间,以便将来插入和更新索引记录。如果按顺序插入索引记录,升序或降序,则生成的索引页的大小约为15/16。此外,由于辅助索引将存储聚集索引 key ,聚集索引 key 的大小将影响辅助索引的大小。聚集索引的功能不单单只是索引,更重要的是,它用于存储引擎为InnoDB的表的所有数据行。聚集索引按 key 也就是主键值顺序存储记录,父节点的 key 会在子节点复制一份,并且每个叶节点连接到其相邻的叶节点。
2024-09-29 02:18:28 1181
转载 SQL执行过程
对于频繁更新的表,查询缓存的命中率非常低,因为只要对表进行更新操作,该表的查询缓存就会被清除。如果刚刚缓存了具有较大查询结果的数据,并且在使用该表之前对其进行了更新操作,则查询缓冲区将被清除,这相当于单独的缓存。MySQL的逻辑架构从上到下依次分为连接层、服务层和存储引擎层(以及最底层的物理文件层),每个层次都承担着不同的职责,共同协作以实现高效、稳定、安全的数据库服务。此查询缓存以键值的形式存储在内存中,键是SQL查询语句,值是SQL语句查询的结果。执行完成后,查询结果将存储在查询缓存中。
2024-09-28 02:08:25 183
原创 MySQl查询分析工具 Optimizer Trace
OPTIMIZER_TRACE是MySQL 5.6引入的一项跟踪功能,它可以跟踪优化器做出的各种决策(比如访问表的方法、各种开销计算、各种转换等),并将跟踪结果记录到表中。EXPLAIN可以帮助您查看查询是否进行全表扫描,还是进行稍微优化的索引扫描。但EXPLAIN并没有真正告诉你MySQL为什么这样做。而Optimizer Trace旨在生成人类和程序可读的输出,以帮助理解MySQL优化器所做的决策和操作。
2024-09-27 23:06:32 1039
spring-tool-suite-4-4.7.1.RELEASE-e4.16.0-win32.win32.x86_64.self-extracting.jar
2020-08-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人