- 博客(214)
- 收藏
- 关注

原创 SpringBoot 可以同时处理多少请求
首先,在Spring Boot应用中,我们可以使用 Tomcat、Jetty、Undertow 等嵌入式 Web 服务器作为应用程序的运行容器。这些服务器都支持并发请求处理的能力。另外,Spring Boot 还提供了一些配置参数,可以对 Web 服务器进行调优,以提高其并发处理能力。而我们大家都知道,Spring Boot应用默认使用的Web服务器(内嵌容器)为Tomcat,了解了以上内容,我们就知道,这个问题的本质就是一个Spring Boot应用,内嵌的Tomcat能够处理多少请求。
2023-10-03 23:36:57
2676
2

原创 Spring的编程式事务TransactionTemplate
本文介绍了Spring框架中TransactionTemplate的用法。TransactionTemplate提供了一种在代码中进行编程式事务管理的方式,使开发人员能够在方法级别定义事务的开始和结束点。通过配置事务管理器并使用TransactionTemplate,我们可以方便地执行事务操作,并根据需要设置传播行为和隔离级别。希望本文能够帮助你更好地理解和应用Spring的事务管理功能。
2023-07-18 22:45:24
9039
3

原创 Explain详解与索引优化最佳实践
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。
2023-03-31 11:39:50
658

原创 分布式锁的介绍和实现(附源码)
在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。那具体什么是分布式锁,分布式锁应用在哪些业务场景、如何来实现分布式锁呢?一、为什么要使用分布式锁我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的锁进行处理。但是,普通的锁只能在单机的情况下使用。如果业务发展,需要做集群,一个应用需要部署到几台机器人然后做负载均衡,如下图所示:...
2022-03-09 20:27:16
1312

原创 BeanFactory和FactoryBean区别
一、BeanFactory1、简单介绍这个其实是所有Spring Bean的容器根接口,给Spring 的容器定义一套规范,给IOC容器提供了一套完整的规范,比如我们常用到的getBean方法等。进入到这个类,我们可以看到如下注释,意思是:访问Spring bean容器的根接口。2、定义方法getBean(String name): Spring容器中获取对应Bean对象的方法,如存在,则返回该对象。 containsBean(String name):Spring容器中是否存在该
2022-02-07 17:41:43
3559
1

原创 @TransactionalEventListener的使用和实现原理
一、问题描述平时我们在完成某些数据的入库后,发布了一个事件,此时使用的是@EventListener,然后在这个事件中,又去对刚才入库的数据进行查询,从而完成后续的操作。例如(数据入库=>对入库数据进行查询审核),这时候会发现,查询不到刚才入库的数据,这是因为事务还没提交完成,在同一个事务当中,查询不到才存入的数据,那么就引出了下面的解决方式。为了解决上述问题,Spring为我们提供了两...
2020-04-25 14:40:05
27008
14

原创 Spring事件发布与监听
最近算是把spring整体的又过了一遍,发现很多东西虽然用的多,但是有些思想理解的不够透彻,在此记录下,顺便感叹下,spring源码看了大部分,这才没过多久又忘了 TnT 。一、事件监听相关概念介绍1、流程分析事件:做了什么事。例如,我在写博客,写博客就是一个事件。监听器:监听发生事件的组件。例如,我们日常生活中的火灾报警器,监听有没有发生火灾事件。在一个完整的事件体...
2019-12-10 16:40:49
1581
1

原创 SpringBoot自动配置原理
最近温习开始温习下SpringBoot的源码,个别的一些原理和用法在此记录一下。一、原理介绍:基于SpringBoot代码版本:2.1.5.RELEASE,2.0.x和2.2.x略有不同。我们都知道使用SpringBoot时候,都会编写一个启动类,启动类上面加@SpringBootApplication注解。SpringBoot之所以能完成自动配置的关键就是在这个注解之中。...
2019-12-02 12:16:41
10722
4

原创 手写模拟SpringMVC
前言:springmvc想必大家都有用过,但是你有去真正的了解过springmvc究竟是怎么进行工作的吗?为什么加上@controller @RequestMapping等注解,就会映射到指定类的方法上呢?下面我们就来探究一下,手写模仿一个springmvc。注:代码演示主要侧重原理的模拟,有很多细节存在不足,请勿较真。 如果有什么改进意见,欢迎大家提出...
2019-11-15 17:59:02
402

原创 Spring源码分析之扩展点BeanDefinitionRegistryPostProcessor
一、BeanDefinitionRegistryPostProcessor接口简介:该接口继承了BeanFactoryPostProcessor接口,且新增postProcessBeanDefinitionRegistry方法。方法参数是BeanDefinitionRegistry对象,BeanDefinitionRegistry对象是bean定义的保存中心(实际底层就是BeanDefini...
2019-10-24 03:18:05
917

原创 关于registerSingleton()方法的缺点
之前在《如何把对象放入spring容器》这篇文章中,提到了registerSingleton()方法。说这个方法有些鸡肋。利用这篇文章解释一下为什么说这个方法它比较鸡肋呢。注:读这篇文章前需要你对spring的依赖关系有一定的了解,否则可能看起来吃力一些。如果实在看不懂,就记住用法就行了,不用纠结。一、关于存在的问题/** * 按照这种写法的话, * 因为当前要托管...
2019-10-11 20:39:44
6185
8
原创 三、Spring IOC容器加载重要组件
读取配置如果配置了这样的Bean:或者或者这些是不同定义bean的方式, 他们最终都会生成bean。那Spring为了生成bean代码复用,使用统一的创建流程,所以通过多态方式读取不同的配置会有不同的读取器,读取完后后续创建bean的流程是通用的。
2025-02-23 22:59:15
664
原创 一、Spring底层核心原理解析
因为AnnotationConfigApplicationContext是比较重要的,并且AnnotationConfigApplicationContext和ClassPathXmlApplicationContext大部分底层都是共同的,后续课程我们会着重将AnnotationConfigApplicationContext的底层实现,对于ClassPathXmlApplicationContext,同学们可以在课程结束后作为作业,业余时间看看相关源码即可。
2025-01-19 22:15:49
925
原创 二十七、Tomcat专题总结与拓展
思考:Tomcat使用了哪些设计模式?思考:Tomcat线程池和传统JDK线程池有什么区别?(自定义线程池的需求可以参考tomcat的线程池)Tomcat线程池默认实现StandardThreadExecutor。Tomcat 线程池和 Java 原生线程池的区别:自定义了拒绝策略,Tomcat 在线程总数达到最大数时,不是立即执行拒绝策略,而是再尝试向任务队列添加任务,添加失败后再执行拒绝策略。TaskQueue 重写了 LinkedBlockingQueue 的 offer 方法。
2024-12-09 21:02:22
852
原创 二十六、Tomcat类加载机制及其热部署热加载原理剖析
Spring 作为共享的第三方 JAR 包,它本身是由 SharedClassLoader 来加载的,Spring 又要去加载业务类,按照前面那条规则,加载 Spring 的类加载器也会用来加载业务类,但是业务类在 Web 应用目录下,不在 SharedClassLoader 的加载路径下,这该怎么办呢?这种类加载机制其实就是双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再 委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。
2024-11-25 22:22:52
845
原创 二十五、Tomcat线程模型分析及其性能调优
I/O 调优实际上是连接器类型的选择,一般情况下默认都是 NIO,在绝大多数情况下都是够用的,除非你的 Web 应用用到了 TLS 加密传输,而且对性能要求极高,这个时候可以考虑 APR,因为 APR 通过 OpenSSL 来处理 TLS 握手和加密 / 解密。那么,子 reactor 会监听客户端连接上的后续事件,有读写事件发生时,它会让在同一个线程中的 handler 读取请求和返回结果,而和单 reactor 多线程类似,具体业务处理,它还是会让线程池中的 worker 线程处理。
2024-11-25 22:13:59
801
原创 二十四、Tomcat整体架构及其设计精髓分析
Tomcat是Apache Software Foundation(Apache软件基金会)开发的一款开源的Java Servlet容器。它是一种Web服务器,用于在服务器端运行Java Servlet和JavaServer Pages (JSP)技术。它可以为Java Web应用程序提供运行环境,并通过HTTP协议处理客户端请求。Tomcat也支持多种Web应用程序开发技术,例如JavaServer Faces (JSF)、Java Persistence API (JPA)等。总的来说,Tomcat是一
2024-11-12 22:27:11
1421
1
原创 MySQL Shell教程
MySQL Shell是MySQL的高级客户端和代码编辑器。它除了基本的SQL功能外,还提供一套使用Javascript和Python的API去管理MySQL。能使用它提供的XDevAPI操作MySQL 8.0提供的关系型数据库和文档数据库,还可以使用AdminAPI管理InnoDB集群。
2024-11-12 21:42:05
2459
1
原创 二十三、Mysql8.0高可用集群架构实战
InnoDB Cluster是MySQL官方实现高可用+读写分离的架构方案,其中包含以下组件:简称MGR,是MySQL的主从同步高可用方案,包括数据同步及角色选举。:是InnoDB Cluster的管理工具,用来创建和管理集群。:是业务流量入口,支持对MGR的主从角色判断,可以配置不同的端口分别对外提供读写服务,实现读写分离。MySQL Router与组复制和MySQL Shell高度整合,只有将其与组复制和MySQL Shell共同使用,才能够称为InnoDB Cluster。
2024-11-04 23:23:16
2308
原创 Docker安装MySQL8.0
注:如果使用客户端连接提示了plugin caching_sha2_password错误,这是因为MySQL8.0的密码策略默认为caching_sha2_password(MySQL5.7无此问题):端口映射,第一个 3310 是映射出去的端口,第二个 3306 是这个容器的端口。:给予容器额外的权限。:文件挂载, 前为宿主机的目录位置,后为容器内文件对应位置。
2024-11-04 21:53:27
984
原创 二十二、MySQL 8.0 主从复制原理分析与实战
MySQL Replication是官方提供的主从同步方案,也是用的最广的同步方案。Replication(复制)使来自一个 MySQL数据库服务器(称为源(Source))的数据能够复制到一个或多个 MySQL 服务器(称为副本(Replica))。默认情况下,复制是异步的;副本不需要永久连接即可从源接收更新。根据配置,您可以复制所有数据库、指定数据库,甚至某个数据库中的指定表。说明: 旧版本的 MySQL 复制将源(Source)称为主(Master),将副本(Replica)称为从(Slave)
2024-10-30 22:58:11
1455
原创 二十一、MySQL全局优化与Mysql 8.0新增特性详解
从上图可以看出SQL及索引的优化效果是最好的,而且成本最低,所以工作中我们要在这块花更多时间。假设服务器配置为:CPU:32核内存:64G下面参数都是服务端参数,默认在配置文件的 [mysqld] 标签下。
2024-10-30 22:33:57
716
原创 二十、Innodb底层原理与Mysql日志机制深入剖析
注意:如果要恢复大量数据,比如程序员经常说的删库跑路的话题,假设我们把数据库所有数据都删除了要怎么恢复了,如果数据库之前没有备份,所有的binlog日志都在的话,就从binlog第一个文件开始逐个恢复每个binlog文件里的数据,这种一般不太可能,因为binlog日志比较大,早期的binlog文件会定期删除的,所以一般不可能用binlog文件恢复整个数据库的。比如,一个系统配置表、字典表,那这张表上的查询才适合使用查询缓存。查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。
2024-10-24 23:02:07
985
原创 十九、深入理解MVCC与BufferPool缓存机制
在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成),这个视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。因为磁盘随机读写的性能是非常差的,所以直接更新磁盘文件是不能让数据库抗住很高并发的。
2024-10-24 22:45:54
736
原创 十八、深入理解Mysql事务隔离级别与锁机制
我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。
2024-10-19 10:00:11
978
原创 十七、Mysql索引优化实战二
整个过程会读取 t2 表的所有数据(扫描100行),然后遍历这每行数据中字段 a 的值,根据 t2 表中 a 的值索引扫描 t1 表中的对应行(扫描100次 t1 表的索引,1次扫描可以认为最终只扫描 t1 表一行完整数据,也就是总共 t1 表也扫描了100行)。当使用left join时,左表是驱动表,右表是被驱动表,当使用right join时,右表时驱动表,左表是被驱动表,当使用join时,mysql会选择数据量比较小的表作为驱动表,大表作为被驱动表。这样,查询结果如果是5,那输出就是05。
2024-10-19 09:37:20
924
原创 十六、Mysql索引优化实战一
MySQL 5.6引入了索引下推优化,可以在索引遍历过程中,对索引中包含的所有字段先做判断,过滤掉不符合条件的记录之后再回表,可以有效的减少回表次数。以社交场景APP来举例,我们一般会去搜索一些好友,这里面就涉及到对用户信息的筛选,这里肯定就是对用户user表搜索了,这个表一般来说数据量会比较大,我们先不考虑分库分表的情况,比如,我们一般会筛选地区(省市),性别,年龄,身高,爱好之类的,有的APP可能用户还有评分,比如用户的受欢迎程度评分,我们可能还会根据评分来排序等等。
2024-10-11 23:15:24
1315
原创 mysql慢查询日志
这个是由参数long_query_time控制,默认情况下long_query_time的值为10秒,可以使用命令修改,也可以在my.cnf参数里面修改。如上所示,我修改了变量long_query_time,但是查询变量long_query_time的值还是10,难道没有修改到呢?log_output='TABLE’表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。my.cnf要增加或修改参数slow_query_log 和slow_query_log_file,如下所示。
2024-10-11 23:06:12
1319
原创 十五、Explain详解与索引最佳实践
使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。
2024-10-06 23:35:18
1150
原创 十三、全面理解Mysql架构
然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行 c 的值就是 0,与原库的值不同。全部使用长连接后,有时候 MySQL 占用内存涨得特别快,因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的,这些资源会在连接断开的时候才释放,所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM)。但如果赊账的人多了,粉板总会有记不下的时候,这个时候掌柜一定还有一个专门记录赊账的账本。
2024-09-25 23:15:29
1070
原创 docker和docker-compose安装
我们在linux上通过docker部署应用时,需要先安装docker和docker-compose,每次安装时,都要参考文章,进行一系列操作,为了更便捷进行安装,故把安装过程总结为脚本,直接运行即可。由于网络原因,可能导致docker-compose下载失败,所以需要进行手动安装,请参考手动安装。下载docker-compose文件后(或使用文章顶部资源),将其上传到系统。系统测试,其他系统无法保证完全适用。目录下,并修改名称为。注意:以下脚本已经过。
2024-09-25 23:03:09
791
原创 十二、JDK17的GC调优策略
我们第一个JVM性能调优专题,到这里就结束了。但是,JVM底层的这些知识,其实就像是武林高手的内功,见面三招可能用不上,但是,越往后越能体现他的价值。这些经过时间沉淀下来的经验,才是程序员最不可替代的核心竞争力。 关于JVM部分,我们这一期的课程暂告一段落,但是,大家的学习并没有结束。对于大家以后的JVM学习,我给大家三条具体的学习建议。1、重框架 JVM这种底层语言要处理的问题也非常复杂,非常深,因此,JVM部分的知识,或者说面试点也是非常虚,非常杂的。
2024-09-23 21:37:59
2155
原创 十一、 JDK17 新特性梳理
“你发任你发,我用 Java8”。虽然业界现在对于 JDK8 后每半年更新一次的 JDK 新版本都保持着比较谨慎的态度,但是 JDK17是一个 Java 程序员不得不去关注的新版本。最直观的原因是,作为现代 Java 应用基石的 Spring 和 SpringBoot ,都在新版本中走出了抛弃 JDK8,支持 JDK17 的这一步。 你或许不一定需要像技术极客一样去紧追 JDK 各种令人眼花缭乱的最新特性,但是 JDK17 却是每个 Java 程序员必须走出的下一个里程碑。
2024-09-22 22:27:43
4356
原创 十、JVM调优实战及常量池详解
这些常量池现在是静态信息,只有到运行时被加载到内存后,这些符号才有对应的内存地址信息,这些常量池一旦被装入内存就变成运行时常量池,对应的符号引用在程序加载或运行时会被转变为被加载到内存区域的代码的直接引用,也就是我们说的动态链接了。在编译期其字符串常量的值就确定下来,故上面程序最终的结果都为true。分析:JVM对于字符串引用,由于在字符串的"+“连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a” + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。
2024-09-22 22:11:42
1122
原创 九、JVM调优工具详解及调优实战
这个因为之前已经大概知道Young GC的频率,假设是每5分钟一次,那么可以执行命令 jstat -gc pid 300000 10 ,观察每次结果eden,survivor和老年代使用的变化情况,在每次gc后eden区使用一般会大幅减少,survivor和老年代都有可能增长,这些增长的对象就是每次Young GC后存活的对象,同时还可以看出每次Young GC后进去老年代大概多少对象,从而可以推算出老年代对象增长速率。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响。
2024-09-18 23:04:54
1188
原创 使用python操作数据库
以上python代码处理的事情,只是我们日常开发中遇到问题的一个缩影,大家可以根据自己的具体需求,进行修改。最重要的是要清楚自己想解决的问题是什么,如何借助工具更好地去解决问题,从而提升自己的工作效率。
2024-09-18 22:49:43
660
3
原创 八、垃圾收集器G1&ZGC详解
G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.G1将Java堆划分为多个大小相等的独立区域(Region),JVM目标是不超过2048个Region(JVM源码里TARGET_REGION_NUMBER 定义),实际可以超过该值,但是不推荐。一般Region大小等于堆大小除以2048,比如堆大小为4096M,则Region大小为2M,当然也可以用参数"-XX:G1HeapRegion
2024-09-16 10:46:40
1093
原创 七、垃圾收集器ParNew&CMS与底层三色标记算法详解
原始快照就是当灰色对象要删除指向白色对象的引用关系时, 就将这个要删除的引用记录下来, 在并发扫描结束之后, 再将这些记录过的引用关系中的灰色对象为根, 重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑色(目的就是让这种对象在本轮gc清理中能存活下来,待下一轮gc的时候重新扫描,这个对象也有可能是浮动垃圾)增量更新就是当黑色对象插入新的指向白色对象的引用关系时, 就将这个新插入的引用记录下来, 等并发扫描结束之后, 再将这些记录过的引用关系中的黑色对象为根, 重新扫描一次。
2024-09-16 10:29:16
1272
原创 六、深入理解JVM 执行引擎
在一般应用中,完全不会逃逸的局部对象和不会逃逸出线程的对象所占的比例是很大的,如果能使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,垃圾收集子系统的压力将会下降很多。当一个方法被调用时,虚拟机会先检查该方法是否存在被即时编译过的版本,如果存在,则优先使用编译后的本地代码来执行。 当解释器遇到一条回边指令时,会先查找将要执行的代码片段是否有已经编译好的版本,如果有的话,它将会优先执行已编译的代码,否则就把回边计数器的值加一,然后判断方法调用计数器与回边计数器值之和是否超过回边计数器的阈值。
2024-09-09 22:37:19
1277
1
程序员如何更好地实现技术变现?
2024-09-26
TA创建的收藏夹 TA关注的收藏夹
TA关注的人