最近承接了一个外呼系统的共建。这类系统的数据特点很鲜明:任务下发、批量外呼、通话记录落库、话单回流,链路上每一步都在往数据库里写数据,而且基本是只增不减的流水型写入——通话记录一天几十万行,话单一天几十万行,跑上一两年,随便一张表就是亿级体量。
项目刚接手没几天,运维那边甩过来几条慢 SQL,让分析一下瓶颈在哪。
拿到慢 SQL,很多人的第一反应是直接 EXPLAIN 跑一把看执行计划。我也想这么干,但手上这是共建系统,表是谁建的、数据长什么样、哪些表已经悄悄长成了巨无霸,我一概不知。同一句缺索引的 SQL,跑在几千行的表上是小事,跑在几千万行的表上就是事故——所以在碰执行计划之前,得先搞清楚:这个库里,到底哪些表是大表。
学习源码之前先思考一个问题,我们为什么要学习源码?有什么用?
对于源码的掌握我了然于胸,记得 21 年开始学习 Spring IOC 源码的时候,我足足看了半年多,一点一点的去分析,可惜当时还没开始写博客,都是做思维导图和流程图居多,后续在整理成系列的博客文章,此处直接晒图,看图捋一遍过程,也相当于复习了
说到 SpringBoot 自动装配的原理,可能有的人就要开始 @EnableAutoConfiguration 的长篇大论了,感觉在背源码一样,那么 自动装配 的含义你是真的了解吗?它是如何与 Spring 相结合的,又是如何被 Spring 管理的?接下来我将告诉你 自动装配 原理的真正打开方式。
对于想要研究SpringBoot源码的小伙伴来说,在本地编译源码环境,然后在研究源码的时候可以添加对应的注释是必须的,本文就给大家来介绍下如何来搭建我们的源码环境。
在日常开发中,我们基于 SpringBoot 框架只需要在 Service 方法上添加一个@Transactional注解,就能轻松实现事务管理。那你有没有想过,为什么在一个方法上轻轻加个 @Transactional 注解,这个方法就有了事务能力?
在这个简单的注解背后,到底是谁在"偷偷"帮我们管理连接、提交、回滚?今天,我们就从这个选题开始,一步步揭开 Spring 事务的神秘面纱。
想要深入了解JUC,必须构建自己的知识体系,此文是整理于《深入理解Java虚拟机(第三版)》书中 [高效并发] 章节以及一些个人总结,是学习JUC并发的基础,必知必会。
今天来聊一聊非 JDK 的高性能队列 Disruptor,ta 是目前性能最高的 MQ,掌握程度也是平庸架构师与高级架构师的区分,包含 Legacy API、用 Translator 发布 Event、使用 Lambda 表达式实现
在梳理了Java内存模型的脉络以后,就讲到线程的基本状态,了解线程存在哪些状态才能对线程安全保障有更清晰的认知。其中JUC中线程安全,有 互斥同步与 非阻塞同步 两种方案,本质就是有锁和无锁的区别,在资源竞争比较大的情况下,无锁的性能要远远高于有锁的;说到了锁,那不得不说一下JVM在锁的方面做出的优化,这也是面试常问synchronized锁升级的细节点。