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

原创 从源码分析常见集合的区别之List接口
List接口实现自接口,是Java的集合框架中的一员,List接口下又有和线程安全的,今天就简单分析一下和的异同以及各自的优势。
2023-08-14 15:14:47
443

原创 MySQL不走索引的情况分析
innodb表的统计信息并不是实时统计更新,如果统计信息和实际的索引信息差异很大,就会导致优化器计算各个索引成本后,做出非预期的选择。出现这种现象的场景是:当有大量数据在短时间内落库时,Innodb还没更新统计相关信息,此时来了一个查询,MySQL会基于历史数据做出错误的判断:当前表数据量少,不走索引更高效。回表操作可能会增加额外的磁盘访问和数据检索的开销,因此,在某些情况下,当MySQL判断回表所需的资源大于直接扫描全表时,它可能选择不走索引,而是执行全表扫描。查询频繁是数据表字段增加合适的索引。
2023-08-11 22:42:22
1526

原创 SpringBoot MDC全局链路解决方案
Filter是Java Servlet 规范定义的一种过滤器接口,它的主要作用是在 Servlet 容器中对请求和响应进行拦截和处理,实现对请求和响应的预处理、后处理和转换等功能。通过实现 Filter 接口,开发人员可以自定义一些过滤器来实现各种功能,如身份验证、日志记录、字符编码转换、防止 XSS 攻击、防止 CSRF 攻击等。那么这里我们使用它对请求做MDC赋值处理。
2023-08-08 22:12:52
1196

原创 百万数据分页查询优化方案
分页列表查询是项目中的热点需求,这种需求的特点是:字段多、数据量大、访问频繁、使用率高的特点,这个功能是给用户最直观的展示系统的信息,针对于多、大、频、热这几个特点,会引申出一个问题:列表展示的数据可能是来自于不同的数据维度、需要关联N张表查询得到,那么,如何让用户更快、更准的获取到需要的数据,便成了程序员在编码时需要考虑到并且需要解决的问题,因为随时间推移,线上系统不乏几百万数据的表。实际的业务场景下,可能会关联N张表,而且线上服务器的压力会比单机开发环境更重,因此实际接口响应时间会更长。
2023-07-26 08:38:56
511

原创 MySQL-MVCC多版本控制及事务的隔离性
MySQL的InnoDB引擎具有不同的事务隔离级别,不同事务隔离级别通过视图创建时机的不同来实现。MVCC:Multiversion concurrency control,即多版本控制,在并发访问数据库时,通过对数据做多版本管理,也就是为每条记录保存多份历史数据供读事务访问,新的写入只需要添加新的版本即可,无需等待。避免因为写数据时要加写锁而阻塞读取数据的请求,实现读取数据不用加锁,读取数据同时修改。修改数据同时可读取。多版本指的是数据表中同一个行数据可能会有多个版本(row),每次事务更新数据的时候,都
2022-12-03 21:59:01
565

原创 从Mapper到JavaBean源码层面解析ResultMap是怎么映射的
起点:源码下载:本文以3.3.x分支版本源码为例。在源码工程的test中以NestedQueryCacheTest测试类下的testThatNestedQueryItemsAreRetrievedFromCache为例:该方法中调的Mapper为:<resultMap id="selectAuthor" type="org.apache.ibatis.domain.blog.Author"> <id column="id" property="id" /> <
2022-05-29 21:23:08
446

原创 Netty协议-Rocket MQ之NettyRemotingClient/Server
RocketMQ性能强劲依赖于Netty通讯协议和特定的通讯协议。通信流程NettyRemotingAbstract类的内部有一个NettyServerHandler内部类,该类中封装了客户端与服务端交互的基础代码。processMessageReceived根据cmd类型处理msg信息 @ChannelHandler.Sharable class NettyServerHandler extends SimpleChannelInboundHandler<RemotingCo
2022-03-23 17:29:21
3770

原创 pageHelper-v4.2源码阅读-分页是怎么实现运行的?
pageHelper的分页是怎么实现运行的?下载pageHelper源码,使用pageHelper的官方demo进行Debug试验。源码地址:本文使用分支: 4.2PageHelper.startPage(2, 10, "id desc");点进第一个断点PageHelper.startPage<E> :Element,常表示List<E>,使用泛型的方式是得代码得到复用,达到允许放入不同List的功能。SqlUtil.getLocalPage:SqlUt
2022-02-08 10:10:42
467

原创 线上问题排查一接口拒绝连接排查思路
在使用feign或者HTTP形式调用接口时,有可能会出现目标接口无法调通,目标服务器拒绝连接的情况。出现该问题的原因有:目标服务器防火墙配置更改,已关闭目标端口。生产者(接口提供方)服务挂掉。排查思路:检查目标服务器防火墙配置,开启目标端口,重启防火墙检查目标服务器服务状态解决过程:查看服务器调用者日志,当出现接口拒绝连接时,可参考以下方案:使用ping IP命令查看目标服务器是否宕机。如果可以Ping通,则可以进行下一步。如果不通需要确认目标服务器是否禁用ping命令或者联系相
2021-12-29 21:32:16
2686

原创 @Value读取properties中文乱码解决方案
当我们在项目中需要读取配置文件的变量时,往往会遇到读取中文乱码的问题:英文字符则不会出现该问题。出现该问题的原因是:SpringBoot在加载配置文件时,使用的默认编码是:ISO_8859_1。详细原因请参考:https://eericzeng.github.io/2019/06/29/SpringBoot%E4%BD%BF%E7%94%A8@Value%E8%AF%BB%E5%8F%96.properties%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81%E5%
2021-12-16 22:07:08
7183

原创 HashMap不完全解读
HashMap的几个重要知识点HashMap是无序且不安全的数据结构。存储结构是数组 + 链表 + 红黑树 (阈值为8 如果链表长度<=8则会把链表变成红黑树 ),数组中存储元素Entry,存储元素的位置被称为桶,每个bucket有且仅有一个元素并指定索引,以实现快速访问。HashMap 是以key–value对的形式存储的,key值是唯一的(可以为null),一个key只能对应着一个value,但是value是可以重复的。HashMap 如果再次添加相同的key值,它会覆盖key值所对应的
2021-02-18 21:52:54
278
4

原创 设计模式之外观(门面)模式
外观(门面)模式外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。类似的实际例子有消息中间件,把一个数据丢到消息中间件,谁需要,谁去消息后中间件去拿。这种设计模式可以用于解耦。我们举个栗子,你要去政府办一件事,你需要先从门口去一楼,再从门口去二楼、最后从门口去五楼,这样整个流程会特别繁琐,外观模式就提供一个门面接口(Facade),门面内把原来的
2020-12-26 20:34:45
1212
1

原创 客官留步,您真的会使用@Component+@Bean注解(配置类)吗?
由此及彼我在写如何在Spring中优雅的使用单例模式?一文的时候有使用到@Component(“xxx”)注解,总所周知,该注解可以将普通的Java类实例化到Spring容器中,可以替代Spring 4.0 版本之前xml配置,xxx就等同于xml中的bean标签的id(所以需要保证唯一),不知道大家有没有了解过Spring配置类的Full模式和Lite模式?如果您第一次听到这个概念,您不妨花费几分钟往下读一读,或许可以让您少掉几根秀发。详细介绍Full模式、Lite模式是针对于Spring的配置“类
2020-12-05 23:18:53
3613
5

原创 BeanUtils.copyProperties知多少?
事出有因近期在读《阿里巴巴开发手册》的时候发现:阿里强制避免使用BeanUtils进行属性的拷贝,但是不得不承认的是,在我自己的项目中确实使用过Apache的Beanutils进行属性拷贝,在读了开发手册后,感觉项目中的代码可以优化一下,基于不同包下的BeanUtils性能和特性有所不同,当然用法也不尽相同,所以,可以你可能会跳入因为导错包导致对象拷贝为null的坑。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dBUkz72I-1606834874223)(C:\Use
2020-12-01 23:03:18
1931
3

原创 基于SpringBoot的策略模式demo
策略模式策略模式是Java 23种设计模式之一,在https://refactoring.guru/design-patterns/网站中这样对策略模式进行了解释:Strategy is a behavioral design pattern that turns a set of behaviors into objects and makes them interchangeable inside original context object.白话翻译一下就是:策略模式可以根据上下文对象的不同
2020-11-29 02:07:30
950
原创 Best practice-ThreadLocal高并发场景的最佳实践
个人理解:该类提供了一个线程级别的变量,不同线程间通过get/set方法可以访问到自己不同的数据副本,ThreadLocal实例通常是类中的私有的静态数据如userId或事务id。类型所创建,key是线程信息,value值是数据的副本,其副本值在各个线程间不可见,在并发模式下各个线程会访问到自己对应副本的数据信息。副本变量值没有被清空,当线程池中的线程被复用时,该线程就会获取到历史请求获取到的副本变量。的线程池中的线程是可以复用的,假设线程id为1的线程在代码执行完毕后,对应的。
2025-02-10 19:52:12
595
原创 2024年终总结-行到水穷处,坐看云起时
我,坐标山东青岛,一位无名的Java Coder,你可以叫我Debug.c亦或者种棵代码技术树。在此不过多赘述关于我,更多的关于我请移步我的2023年年终总结。2023年终总结-轻舟已过万重山2023年年末共在三个方面给2024年定了基调:技术、知识分享、生活。先看当前许下的愿:源码学习的进度从24年春夏交接开始至今一直处于停摆状态,的学习用于和伟的一首歌来表达便是《只字不提》。是的,2024年的技术长进是我从业以来最慢的一年,一方面是24年春天开始接触HIS(Hospital Information Sy
2025-01-21 20:17:59
754
原创 MySQL关于varchar排序你不知道的秘密
来自维基百科翻译下来:一种用于不同语言和文字的国际编码标准,根据该标准,每个字母、数字或符号都被赋予一个适用于不同平台和程序的唯一数值。总结一句话:任意字符可以通过Unicode 标准将其转换为唯一数值。不同的业务场景,大到技术选型,小到字段类型的使用,需要根据实际需求进行方案推演。一个好的设计是完成一个系统的开始也是必要条件,开始时遵循”以终为始“的思维方式可以避免后续很多不必要的问题,它的核心思想是从最终目标出发,反向推导出实现目标的步骤和方法,从而确保行动始终围绕目标展开,不会偏离方向。
2025-01-06 19:46:14
735
原创 这篇文章不枯燥-何为MySQL行锁?
在介绍行锁概念前,请想象一张用于统计年终礼品领取情况的在线Excel,其中每一行代表一条用户的礼品领取信息。假设多个人要同时编辑这张表格,但为了防止不同的人同时修改同一行导致混乱,每当有人编辑某一行时,在线Excel文档就会给这行加一个“锁”,这个锁相当于一个“正在编辑中”的标识,其他人只能等待当前编辑的人完成(释放锁),才能修改这一行的数据。行锁是数据表中行级数据的锁。在代码开发中,我举一个下单业务场景的例子,用户A和用户B先后对一本书下单扣库存,那么在MySQL层面则需要执行类似。
2024-10-20 00:11:43
672
原创 轻松设置:服务器域名配置全攻略
SSL证书分为两种:正式证书和个人测试证书,正式证书需要购买,个人测试证书免费,有效期三个月,阿里云每年单个域名可以签发20个免费证书,到有效期后再次下载新的免费证书替换即可,20个免费证书足够一年的使用量。完成后状态是绿色的正常,我是由于备案所以设为了暂停状态。解压后是一个.pem文件和一个.key文件,为了后续配置方便,我将文件名称分别改为:server.pem、server.key。的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。
2024-07-06 15:29:00
3819
原创 byte[]转MultipartFile、byte[]转File一次看个够
是Spring框架3.1版本后引入,用于与库集成的适配器。它实现了Spring的接口,允许你将的FileItem对象作为Spring的来使用。
2024-06-20 21:14:34
7165
2
原创 读书-《蛤蟆先生去看心理医生》
罗伯特·戴博德(Robert de Board),毕业于剑桥大学赛尔文学院,曾任教于英国亨利商学院,是一位经验丰富的心理学研究者和临床实践者。他的两本专业著作《咨询技巧》和《组织的心理分析》都是英国畅销的心理学类教科书。本书是他最著名、最畅销的一本大众心理学著作。
2024-06-04 20:22:16
449
原创 Thread的stop和interrupt的区别
方法会导致线程突然终止,可能导致如:线程持有的资源没有被正确释放,使得程序状态不一致问题。因此建议使用更安全的方式来停止线程,比如使用。的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。🏆在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。因为本质上它是不安全的,使用该方法可能会导致数据、资源不一致的问题,👋🏻你好,我是Debug.c。📞如果您对我感兴趣,请联系我。
2024-06-01 10:31:07
271
原创 通俗易懂讲乐观锁与悲观锁
假设线程1要使用乐观锁对id为1的数据做修改,在修改前,需要先查询数据数据版本,然后再执行其他逻辑,在执行其他逻辑的期间,该数据可能被其他线程所修改,在下边的案例中修改了对应的数据,此时线程1并不知道其他线程修改了数据,为了判断数据是否被修改,线程1在更新时在where条件中校验数据版本,如果数据被修改过,则version版本不可能为1,因此,可以通过update语句的影响行数判断数据是否被修改。悲观锁在使用时都会把公共资源进行加锁,其他线程处于阻塞状态,性能相较于乐观锁较低,综合以上,
2024-06-01 10:30:27
916
原创 通俗易懂讲乐观锁与悲观锁
假设线程1要使用乐观锁对id为1的数据做修改,在修改前,需要先查询数据数据版本,然后再执行其他逻辑,在执行其他逻辑的期间,该数据可能被其他线程所修改,在下边的案例中修改了对应的数据,此时线程1并不知道其他线程修改了数据,为了判断数据是否被修改,线程1在更新时在where条件中校验数据版本,如果数据被修改过,则version版本不可能为1,因此,可以通过update语句的影响行数判断数据是否被修改。悲观锁在使用时都会把公共资源进行加锁,其他线程处于阻塞状态,性能相较于乐观锁较低,综合以上,
2024-05-15 22:53:49
860
原创 图解JDK 8 HashMap
HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。HashMap可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个JDK1.8 之前HashMap由 数组+链表 组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后的HashMap。
2024-04-14 16:30:51
364
原创 利用Spring Boot实现MySQL 8.0和MyBatis-Plus的JSON查询
在现代的Web开发中,处理JSON数据已经变得无处不在,而在关系型数据库中高效地查询JSON结构变得愈发重要。MySQL 8.0结合MyBatis-Plus和Spring Boot,为管理和查询JSON数据提供了强大的工具。在本文中,我们将探讨两种使用MySQL 8.0和MyBatis-Plus在Spring Boot应用中查询JSON数据的方法。
2024-03-04 20:31:34
2965
原创 基于Java和Spring:实现图片压缩、WebP格式转换与水印添加
WebP官网WebP是一种由Google开发的现代图像格式,旨在提供更高的压缩率和更好的图像质量,相比于传统的JPEG、PNG等格式,能够显著减少图像文件的大小。WebP图像通常具有更小的文件大小,因此可以加快网页加载速度,节省带宽和用户的流量消耗。WebP图像支持有损压缩和无损压缩两种模式。在有损压缩模式下,WebP图像通常能够实现较高的压缩比,而在无损压缩模式下,WebP图像则可以保留原始图像的质量而实现较小的文件体积。
2024-02-24 14:02:26
2270
1
原创 优化MyBatis查询条件:从Boolean类型判断到<choose>标签的进化
作为一名程序员,我们的代码首先要保证功能可用,在功能可用的前提下,要保证代码质量可读性、安全、性能等。吾日三省吾身,多思考一下代码如何能写的更好,这要求我们需要不断探索代码的最佳实践。保持持续学习的态度,每天优化一点点,一点点改进,从而写出更加优雅、高效和安全的代码。
2024-02-19 11:52:06
938
原创 深入分析 Spring 中 Bean 名称的加载机制
深入分析-Spring BeanDefinition构造元信息》XML配置文件、注解、Java配置类,从Spring Framework 3.0(2019年12月发布)版本开始推荐使用注解来定义Bean,而不是XML配置文件,因此,本文的重点是放在探索Spring Framework如何从使用注解定义的Bean元数据中获取到Bean的名称。在Spring Framework中用于生成基于注解的Bean名称,其主要作用是根据指定的注解信息,生成符合规范的Bean名称。
2024-01-13 22:39:29
1063
原创 深入分析-Spring BeanDefinition构造元信息
/value = “HelloService” 即为Bean:HelloService的元数据,在构造方法中的依赖关系同样属于元数据。@Component(value = “balanceRedisProcessor”) 是Bean:BalanceRedisProcessorService的元数据,在构造方法中的依赖关系同样属于元数据。return id;// 2. 通过 AbstractBeanDefinition 以及派生类。
2024-01-07 14:49:18
1100
2
原创 探秘Spring中的BeanDefinition:每个Bean都是一个独特的“小镇居民”
在Spring框架中,核心思想之一就是将应用程序中的各种组件,例如对象、服务、数据源等,都抽象为Spring Bean,并将它们注册到Spring容器中。这种注册的方式提供了一种基于IoC(Inversion of Control,控制反转)的管理方式,即不再由应用程序主动去创建和管理对象,而是由Spring容器负责管理和注入这些对象。而BeanDefinition是用来描述和定义Bean的元数据对象。BeanDefinition包含了关于Bean的各种信息,如类名、属性值、构造函数参数等。
2024-01-04 09:08:29
960
原创 MapStruct @Mapping注解:优雅处理映射中的Null值
Mapping注解是MapStruct中用于定制字段映射关系的重要工具。通过@Mapping注解,我们可以指定源对象和目标对象之间的字段映射关系,包括字段名、转换方法等信息。在处理Null值时,@Mapping注解提供了一些强大的选项,使得映射过程更加灵活和可控。除了使用默认值和设置目标对象字段为默认值之外,MapStruct还支持自定义Null值处理策略。通过在@Mapper注解中配置nullValueCheckStrategy属性,我们可以指定一个自定义的策略类,来决定在映射过程中如何处理Null值。
2023-12-27 21:19:06
3233
原创 Spring Framework中BeanFactory与ApplicationContext的关系与区别
首先来看来自官方文档的描述:我们来翻译一下:beans和context是Spring Framework的IoC容器的基础。BeanFactory接口提供了一种高级配置机制,能够管理任何类型的对象。IoC(Inversion of Control)是Spring Framework的核心设计思想:它将对象的创建、组装、管理交给容器(container),BeanFactory提供了访问IoC的接口,使得开发者可以更方便的使用Spring框架来实现控制和依赖注入。
2023-12-23 17:55:40
906
原创 深入了解ThreadLocal:避免内存泄漏的陷阱与最佳实践
在深入讨论的内存泄漏问题之前,我们先来了解一下的基本概念。是Java中的一个工具类,提供了一种线程级别的数据隔离机制。通过,我们可以在每个线程中存储自己的数据副本,互不影响,从而简化了多线程编程中的共享数据问题。是一个强大的工具,能够在多线程环境中解决共享数据的问题。然而,开发者在使用时应当小心,特别是在长时间存在的线程和线程池等场景下,要注意及时清理,以避免内存泄漏的发生。通过正确的使用习惯和最佳实践,可以更好地发挥的优势,确保多线程环境下的数据安全和性能。
2023-12-12 15:37:12
1052
原创 2023年终总结-轻舟已过万重山
白,陇西布衣,流落楚、汉。-与韩荆州书我来自孔孟故里山东济宁,也许是小学时的某一天,我第一次接触到了电脑,从此对它产生了强烈的兴趣,高中我有一个愿望:成为一名计算机从业者。18岁的我踏入北上的列车,进入我的大学生活。可录取通知书上并非我期待的那样:被计算机学院录取从此踏上编码的快车道。也许是高中比较喜欢当时化学老师的课,在我能填报的六个志愿中,我无一例外的把计算机、软件类专业放在了第一个,把化工、化学相关的专业放在了第二个。
2023-12-09 21:31:36
1074
原创 SUM函数在SQL中的值处理原则
的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。函数时,对于字段中的NULL值,需要特别注意其处理原则,以确保计算结果的准确性。🏆在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。如果SUM函数作用的字段在所有匹配的记录中存在任意一条数据不为。函数是用于计算指定字段的总和的聚合函数。值替换为特定的默认值,从而更好地控制计算的行为。函数作用的字段在所有匹配的记录中均为。在实际应用中,确保对字段的。
2023-12-07 08:45:00
1255
原创 深入解析ThreadPoolTaskExecutor的阻塞队列技术选型
是Spring框架中强大的线程池实现,通过合理选择阻塞队列类型,我们可以更好地满足应用程序的需求,提高性能和稳定性。在实际应用中,根据具体场景调整线程池配置,选择适当的阻塞队列,将有助于构建出更为健壮和高效的多线程应用。希望本文对您理解的阻塞队列提供了一些有价值的信息。如果您有任何问题或建议,请随时在评论中分享。
2023-12-06 09:54:18
978
原创 你离高级开发只差这些IntelliJ IDEA Debug使用技巧
IntelliJ IDEA,由JetBrains(捷克共和国)开发的一款强大的Java集成开发环境(IDE),因其丰富的功能、智能的代码辅助以及用户友好的界面设计,在全球范围内广受Java开发者的喜爱,在国内,笔者遇到过不使用IDEA的Java程序员不超过三个。它使开发者能够逐行执行代码,检查运行时的状态,包括变量值、内存占用、线程状态等,从而帮助开发者理解代码的实际行为,定位并修复错误。的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。
2023-12-04 16:21:27
1153
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人