自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Evan's Blog ٩(๑❛ᴗ❛๑)۶

我不会Java,但也不是一点都不会

  • 博客(205)
  • 收藏
  • 关注

原创 SpringBoot 可以同时处理多少请求

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

2023-10-03 23:36:57 2606 2

原创 Spring的编程式事务TransactionTemplate

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

2023-07-18 22:45:24 8297 3

原创 Explain详解与索引优化最佳实践

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。

2023-03-31 11:39:50 564

原创 分布式锁的介绍和实现(附源码)

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

2022-03-09 20:27:16 1277

原创 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 2478 1

原创 @TransactionalEventListener的使用和实现原理

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

2020-04-25 14:40:05 25454 14

原创 Spring事件发布与监听

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

2019-12-10 16:40:49 1549 1

原创 SpringBoot自动配置原理

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

2019-12-02 12:16:41 10666 4

原创 手写模拟SpringMVC

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

2019-11-15 17:59:02 386

原创 Spring源码分析之扩展点BeanDefinitionRegistryPostProcessor

一、BeanDefinitionRegistryPostProcessor接口简介:该接口继承了BeanFactoryPostProcessor接口,且新增postProcessBeanDefinitionRegistry方法。方法参数是BeanDefinitionRegistry对象,BeanDefinitionRegistry对象是bean定义的保存中心(实际底层就是BeanDefini...

2019-10-24 03:18:05 891

原创 关于registerSingleton()方法的缺点

之前在《如何把对象放入spring容器》这篇文章中,提到了registerSingleton()方法。说这个方法有些鸡肋。利用这篇文章解释一下为什么说这个方法它比较鸡肋呢。注:读这篇文章前需要你对spring的依赖关系有一定的了解,否则可能看起来吃力一些。如果实在看不懂,就记住用法就行了,不用纠结。一、关于存在的问题/** * 按照这种写法的话, * 因为当前要托管...

2019-10-11 20:39:44 6037 8

原创 二十二、MySQL 8.0 主从复制原理分析与实战

MySQL Replication是官方提供的主从同步方案,也是用的最广的同步方案。Replication(复制)使来自一个 MySQL数据库服务器(称为源(Source))的数据能够复制到一个或多个 MySQL 服务器(称为副本(Replica))。默认情况下,复制是异步的;副本不需要永久连接即可从源接收更新。根据配置,您可以复制所有数据库、指定数据库,甚至某个数据库中的指定表。说明: 旧版本的 MySQL 复制将源(Source)称为主(Master),将副本(Replica)称为从(Slave)

2024-10-30 22:58:11 1001

原创 二十一、MySQL全局优化与Mysql 8.0新增特性详解

从上图可以看出SQL及索引的优化效果是最好的,而且成本最低,所以工作中我们要在这块花更多时间。假设服务器配置为:CPU:32核内存:64G下面参数都是服务端参数,默认在配置文件的 [mysqld] 标签下。

2024-10-30 22:33:57 503

原创 二十、Innodb底层原理与Mysql日志机制深入剖析

注意:如果要恢复大量数据,比如程序员经常说的删库跑路的话题,假设我们把数据库所有数据都删除了要怎么恢复了,如果数据库之前没有备份,所有的binlog日志都在的话,就从binlog第一个文件开始逐个恢复每个binlog文件里的数据,这种一般不太可能,因为binlog日志比较大,早期的binlog文件会定期删除的,所以一般不可能用binlog文件恢复整个数据库的。比如,一个系统配置表、字典表,那这张表上的查询才适合使用查询缓存。查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。

2024-10-24 23:02:07 883

原创 十九、深入理解MVCC与BufferPool缓存机制

在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成),这个视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。因为磁盘随机读写的性能是非常差的,所以直接更新磁盘文件是不能让数据库抗住很高并发的。

2024-10-24 22:45:54 679

原创 十八、深入理解Mysql事务隔离级别与锁机制

我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计了事务隔离机制、锁机制、MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题。接下来,我们会深入讲解这些机制,让大家彻底理解数据库内部的执行原理。

2024-10-19 10:00:11 830

原创 十七、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 865

原创 十六、Mysql索引优化实战一

MySQL 5.6引入了索引下推优化,可以在索引遍历过程中,对索引中包含的所有字段先做判断,过滤掉不符合条件的记录之后再回表,可以有效的减少回表次数。以社交场景APP来举例,我们一般会去搜索一些好友,这里面就涉及到对用户信息的筛选,这里肯定就是对用户user表搜索了,这个表一般来说数据量会比较大,我们先不考虑分库分表的情况,比如,我们一般会筛选地区(省市),性别,年龄,身高,爱好之类的,有的APP可能用户还有评分,比如用户的受欢迎程度评分,我们可能还会根据评分来排序等等。

2024-10-11 23:15:24 1152

原创 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 743

原创 十五、Explain详解与索引最佳实践

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中。

2024-10-06 23:35:18 961

原创 十四、深入理解Mysql索引底层数据结构与算法

叶节点具有相同的深度,叶节点的指针为空。所有索引元素不重复。节点中的数据索引从左到右递增排列。

2024-10-06 22:11:48 905

原创 十三、全面理解Mysql架构

然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行 c 的值就是 0,与原库的值不同。全部使用长连接后,有时候 MySQL 占用内存涨得特别快,因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的,这些资源会在连接断开的时候才释放,所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM)。但如果赊账的人多了,粉板总会有记不下的时候,这个时候掌柜一定还有一个专门记录赊账的账本。

2024-09-25 23:15:29 1036

原创 docker和docker-compose安装

我们在linux上通过docker部署应用时,需要先安装docker和docker-compose,每次安装时,都要参考文章,进行一系列操作,为了更便捷进行安装,故把安装过程总结为脚本,直接运行即可。由于网络原因,可能导致docker-compose下载失败,所以需要进行手动安装,请参考手动安装。下载docker-compose文件后(或使用文章顶部资源),将其上传到系统。系统测试,其他系统无法保证完全适用。目录下,并修改名称为。注意:以下脚本已经过。

2024-09-25 23:03:09 623

原创 十二、JDK17的GC调优策略

​ 我们第一个JVM性能调优专题,到这里就结束了。但是,JVM底层的这些知识,其实就像是武林高手的内功,见面三招可能用不上,但是,越往后越能体现他的价值。这些经过时间沉淀下来的经验,才是程序员最不可替代的核心竞争力。​ 关于JVM部分,我们这一期的课程暂告一段落,但是,大家的学习并没有结束。对于大家以后的JVM学习,我给大家三条具体的学习建议。1、重框架​ JVM这种底层语言要处理的问题也非常复杂,非常深,因此,JVM部分的知识,或者说面试点也是非常虚,非常杂的。

2024-09-23 21:37:59 1471

原创 十一、 JDK17 新特性梳理

​ “你发任你发,我用 Java8”。虽然业界现在对于 JDK8 后每半年更新一次的 JDK 新版本都保持着比较谨慎的态度,但是 JDK17是一个 Java 程序员不得不去关注的新版本。最直观的原因是,作为现代 Java 应用基石的 Spring 和 SpringBoot ,都在新版本中走出了抛弃 JDK8,支持 JDK17 的这一步。​ 你或许不一定需要像技术极客一样去紧追 JDK 各种令人眼花缭乱的最新特性,但是 JDK17 却是每个 Java 程序员必须走出的下一个里程碑。

2024-09-22 22:27:43 1999

原创 十、JVM调优实战及常量池详解

这些常量池现在是静态信息,只有到运行时被加载到内存后,这些符号才有对应的内存地址信息,这些常量池一旦被装入内存就变成运行时常量池,对应的符号引用在程序加载或运行时会被转变为被加载到内存区域的代码的直接引用,也就是我们说的动态链接了。在编译期其字符串常量的值就确定下来,故上面程序最终的结果都为true。分析:JVM对于字符串引用,由于在字符串的"+“连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a” + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。

2024-09-22 22:11:42 1089

原创 九、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 1100

原创 使用python操作数据库

以上python代码处理的事情,只是我们日常开发中遇到问题的一个缩影,大家可以根据自己的具体需求,进行修改。最重要的是要清楚自己想解决的问题是什么,如何借助工具更好地去解决问题,从而提升自己的工作效率。

2024-09-18 22:49:43 530 2

原创 八、垃圾收集器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 971

原创 七、垃圾收集器ParNew&CMS与底层三色标记算法详解

原始快照就是当灰色对象要删除指向白色对象的引用关系时, 就将这个要删除的引用记录下来, 在并发扫描结束之后, 再将这些记录过的引用关系中的灰色对象为根, 重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑色(目的就是让这种对象在本轮gc清理中能存活下来,待下一轮gc的时候重新扫描,这个对象也有可能是浮动垃圾)增量更新就是当黑色对象插入新的指向白色对象的引用关系时, 就将这个新插入的引用记录下来, 等并发扫描结束之后, 再将这些记录过的引用关系中的黑色对象为根, 重新扫描一次。

2024-09-16 10:29:16 1171

原创 六、深入理解JVM 执行引擎

在一般应用中,完全不会逃逸的局部对象和不会逃逸出线程的对象所占的比例是很大的,如果能使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,垃圾收集子系统的压力将会下降很多。当一个方法被调用时,虚拟机会先检查该方法是否存在被即时编译过的版本,如果存在,则优先使用编译后的本地代码来执行。​ 当解释器遇到一条回边指令时,会先查找将要执行的代码片段是否有已经编译好的版本,如果有的话,它将会优先执行已编译的代码,否则就把回边计数器的值加一,然后判断方法调用计数器与回边计数器值之和是否超过回边计数器的阈值。

2024-09-09 22:37:19 1205

原创 五、JVM字节码文件结构深度剖析

接下来49个字节: 63 6F 6D 2F 74 75 6C 69 6E 67 2F 73 6D 6C 7A 2F 6A 76 6D 2F 63 6C 61 73 73 62 79 61 74 65 63 6F 64 65 2F 54 75 6C 69 6E 67 42 79 74 65 43 6F 64 65 表示字符串com/tuling/smlz/jvm/classbyatecode/TulingByteCode。index:index是这个局部变量在栈帧局部变量表中Slot的位置。

2024-09-09 22:06:23 567

原创 四、JVM对象创建与内存分配机制深度剖析

大量的对象被分配在eden区,eden区满了后会触发minor gc,可能会有99%以上的对象成为垃圾被回收掉,剩余存活的对象会被挪到为空的那块survivor区,下一次eden区满了后又会触发minor gc,把eden区和survivor区垃圾对象回收,把剩余存活的对象一次性挪动到另外一块为空的survivor区,因为新生代的对象都是朝生夕死的,存活时间很短,所以JVM默认的8:1:1的比例是很合适的,为了减少临时对象在堆内分配的数量,JVM通过逃逸分析确定该对象不会被外部访问。

2024-09-07 23:18:18 1165

原创 三、JVM内存模型深度剖析与优化

对象在堆内部挪动的过程其实是复制,原有区域对象还在,一般不直接清理,JVM内部清理过程只是将对象分配指针移动到区域的头位置即可,比如扫描s0区域,扫到gcroot引用的非垃圾对象是将这些对象复制到s1或老年代,最后扫描完了将s0区域的对象分配指针移动到区域的起始位置即可,s0区域之前对象并不直接清理,当有新对象分配了,原有区域里的对象也就被清除了。设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。默认2表示新生代占年老代的1/2,占整个堆内存的1/3。

2024-08-31 19:34:24 704

原创 二、JAVA类加载机制升职加薪之旅

​ 虽然经理在OA系统里看不到SalaryCaler类的源码了,但是通过OA系统的源码最终还是可以找到这个jar包。那么就可以对jar包进行反编译,查看到jar包对应的源码了。所以,老王还需要考虑如何对class文件进行代码混淆,让经理无法反编译出源码。简单一点的,将class文件的后缀改一下,从.class转为.myclass。就像大家把游戏软件改成.txt结尾一样。只是修改后缀,那么经理还可以把后缀改回来再反编译。所以稳妥一点的方法,是要改一改class文件当中的二进制内容。

2024-08-31 17:59:42 882

原创 一、全面理解 JVM 虚拟机

​ 首先:面试需要。面试题层出不穷,难道每次面试都靠背几百上千条面试八股?​ 其次:基础决定上层建筑。自己写的代码都不知道是怎么回事,怎么可能写出靠谱的系统?​ 然后:学习JVM也是进行JVM调优的基础。写的代码放到线上要如何运行?要配多少内存?4G够不够?线上环境出问题,服务崩溃了,怎么快速定位?怎么解决问题?​ 总之,学不学JVM,是能自主解决问题的一流程序员与跟着别人做CRUD的二流程序员的分水岭!二流程序员会觉得学JVM无关紧要,反正开发也用不上。做开发我只要学各种框架就行了。而一流程序员都在尽自己

2024-08-27 20:44:57 981

原创 CompletableFuture的使用

现在大部分的CPU都是多核,我们都知道想要提升我们应用程序的运行效率,就必须得充分利用多核CPU的计算能力;Java为我们提供了大量多线程API,使用它们可以让我们的代码避免同步阻塞,从而达到提升运行效率的目的,CompletableFuture就是其中一个非常强大且重要API,下面我们就来介绍一下CompletableFuture的概念和使用。

2023-03-20 15:42:05 9428

原创 @AliasFor的使用方法

注意,我们需要在MyCombinedAnnotation中加上@MyAnnotation1、@MyAnnotation2、@MyAnnotation3三个注解,表示这个新注解中包含了这三个注解的所有属性,可以通过@MyCombinedAnnotation来代替这三个注解的使用。当然,你也可以理解为将一个注解上的属性值传递给另一个注解,我个人更习惯采用这种理解,因为后续可以通过一个注解组合多个注解进行使用,通过一个注解将值传递给多个注解,而这与java的继承的概念并不相同。

2023-03-07 12:48:13 3015 2

原创 flyway的快速入门教程

一、简单介绍  Flyway是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。  在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表也会在迭代周期不断迭代。在Java应用程序中使用Flyway,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的。flyway官方文档https://flywaydb.org/documentation/二、为什么要使用flyway.

2022-04-12 21:35:45 40217 14

原创 使用docker安装mysql8

一、安装docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --lower_case_table_names=1 mysql:8.0.25参数解释-v:挂载宿主机目录和 docker容器中的目录,前面是宿主机目录,后面是容器内部目录。-d:后台运行容器。-p:映射容器端口号和宿主机端口号。-e:环境参数,MYSQL_ROOT_PASSWORD设置root用户的密码。–lower_case_table_n

2022-03-28 20:07:55 9814

docker-compose-linux-x86-64-2.3.3

docker-compose-linux-x86-64-2.3.3

2024-09-25

class文件结构参照表全集

class文件结构参照表全集

2024-09-09

class常量池类型分类

class常量池类型分类

2024-09-09

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除