笔记
文章平均质量分 65
爱叨叨的程序狗
码农,不只Coding.
展开
-
这篇文章不枯燥-何为MySQL行锁?
在介绍行锁概念前,请想象一张用于统计年终礼品领取情况的在线Excel,其中每一行代表一条用户的礼品领取信息。假设多个人要同时编辑这张表格,但为了防止不同的人同时修改同一行导致混乱,每当有人编辑某一行时,在线Excel文档就会给这行加一个“锁”,这个锁相当于一个“正在编辑中”的标识,其他人只能等待当前编辑的人完成(释放锁),才能修改这一行的数据。行锁是数据表中行级数据的锁。在代码开发中,我举一个下单业务场景的例子,用户A和用户B先后对一本书下单扣库存,那么在MySQL层面则需要执行类似。原创 2024-10-20 00:11:43 · 647 阅读 · 0 评论 -
byte[]转MultipartFile、byte[]转File一次看个够
是Spring框架3.1版本后引入,用于与库集成的适配器。它实现了Spring的接口,允许你将的FileItem对象作为Spring的来使用。原创 2024-06-20 21:14:34 · 5350 阅读 · 1 评论 -
Thread的stop和interrupt的区别
方法会导致线程突然终止,可能导致如:线程持有的资源没有被正确释放,使得程序状态不一致问题。因此建议使用更安全的方式来停止线程,比如使用。的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。🏆在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。因为本质上它是不安全的,使用该方法可能会导致数据、资源不一致的问题,👋🏻你好,我是Debug.c。📞如果您对我感兴趣,请联系我。原创 2024-06-01 10:31:07 · 243 阅读 · 0 评论 -
通俗易懂讲乐观锁与悲观锁
假设线程1要使用乐观锁对id为1的数据做修改,在修改前,需要先查询数据数据版本,然后再执行其他逻辑,在执行其他逻辑的期间,该数据可能被其他线程所修改,在下边的案例中修改了对应的数据,此时线程1并不知道其他线程修改了数据,为了判断数据是否被修改,线程1在更新时在where条件中校验数据版本,如果数据被修改过,则version版本不可能为1,因此,可以通过update语句的影响行数判断数据是否被修改。悲观锁在使用时都会把公共资源进行加锁,其他线程处于阻塞状态,性能相较于乐观锁较低,综合以上,原创 2024-06-01 10:30:27 · 901 阅读 · 0 评论 -
通俗易懂讲乐观锁与悲观锁
假设线程1要使用乐观锁对id为1的数据做修改,在修改前,需要先查询数据数据版本,然后再执行其他逻辑,在执行其他逻辑的期间,该数据可能被其他线程所修改,在下边的案例中修改了对应的数据,此时线程1并不知道其他线程修改了数据,为了判断数据是否被修改,线程1在更新时在where条件中校验数据版本,如果数据被修改过,则version版本不可能为1,因此,可以通过update语句的影响行数判断数据是否被修改。悲观锁在使用时都会把公共资源进行加锁,其他线程处于阻塞状态,性能相较于乐观锁较低,综合以上,原创 2024-05-15 22:53:49 · 825 阅读 · 0 评论 -
MapStruct @Mapping注解:优雅处理映射中的Null值
Mapping注解是MapStruct中用于定制字段映射关系的重要工具。通过@Mapping注解,我们可以指定源对象和目标对象之间的字段映射关系,包括字段名、转换方法等信息。在处理Null值时,@Mapping注解提供了一些强大的选项,使得映射过程更加灵活和可控。除了使用默认值和设置目标对象字段为默认值之外,MapStruct还支持自定义Null值处理策略。通过在@Mapper注解中配置nullValueCheckStrategy属性,我们可以指定一个自定义的策略类,来决定在映射过程中如何处理Null值。原创 2023-12-27 21:19:06 · 2770 阅读 · 0 评论 -
深入了解ThreadLocal:避免内存泄漏的陷阱与最佳实践
在深入讨论的内存泄漏问题之前,我们先来了解一下的基本概念。是Java中的一个工具类,提供了一种线程级别的数据隔离机制。通过,我们可以在每个线程中存储自己的数据副本,互不影响,从而简化了多线程编程中的共享数据问题。是一个强大的工具,能够在多线程环境中解决共享数据的问题。然而,开发者在使用时应当小心,特别是在长时间存在的线程和线程池等场景下,要注意及时清理,以避免内存泄漏的发生。通过正确的使用习惯和最佳实践,可以更好地发挥的优势,确保多线程环境下的数据安全和性能。原创 2023-12-12 15:37:12 · 1038 阅读 · 0 评论 -
2023年终总结-轻舟已过万重山
白,陇西布衣,流落楚、汉。-与韩荆州书我来自孔孟故里山东济宁,也许是小学时的某一天,我第一次接触到了电脑,从此对它产生了强烈的兴趣,高中我有一个愿望:成为一名计算机从业者。18岁的我踏入北上的列车,进入我的大学生活。可录取通知书上并非我期待的那样:被计算机学院录取从此踏上编码的快车道。也许是高中比较喜欢当时化学老师的课,在我能填报的六个志愿中,我无一例外的把计算机、软件类专业放在了第一个,把化工、化学相关的专业放在了第二个。原创 2023-12-09 21:31:36 · 1057 阅读 · 0 评论 -
你离高级开发只差这些IntelliJ IDEA Debug使用技巧
IntelliJ IDEA,由JetBrains(捷克共和国)开发的一款强大的Java集成开发环境(IDE),因其丰富的功能、智能的代码辅助以及用户友好的界面设计,在全球范围内广受Java开发者的喜爱,在国内,笔者遇到过不使用IDEA的Java程序员不超过三个。它使开发者能够逐行执行代码,检查运行时的状态,包括变量值、内存占用、线程状态等,从而帮助开发者理解代码的实际行为,定位并修复错误。的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。原创 2023-12-04 16:21:27 · 1129 阅读 · 0 评论 -
Spring Framework IOC依赖查找 - 按名称查找解析
具体来说,在使用ApplicationContext作为容器时,如果不显式地配置为延迟初始化,那么所有的单例bean都会在容器启动时被实例化。是指在需要使用某个资源或对象时才进行加载,而不是在应用程序启动时就提前加载。在Spring Framework中,实时加载和延迟加载是指在容器启动时是否立即实例化bean的不同策略。的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。在实际应用中,根据具体的需求和场景来选择合适的加载方式是非常重要的。原创 2023-11-19 15:22:14 · 117 阅读 · 0 评论 -
Spring Framework中的依赖注入:构造器注入 vs. Setter注入
构造器注入和Setter注入是依赖注入(Dependency Injection,DI)中两种常见的方式,用于向一个对象注入其所依赖的其他对象或数值。这两种注入方式有各自的特点和用途。总结以上论点就是:通过构造器注入对象,实现了对象初始化后的不可变性,同时确保所需依赖不为空。这有助于保持对象状态的稳定性。通过构造器注入,可以清晰地看到类的依赖关系,大量构造器参数说明当前类耦合过多、职责过多,从而促使编码者考虑是否需要重构,以提高代码质量和可维护性。原创 2023-11-14 21:31:49 · 256 阅读 · 0 评论 -
优雅的Java编程:将接口对象作为方法参数
在Java编程中,方法的参数传递方式通常是通过基本类型、对象引用或者集合等方式。然而,一种更加优雅且灵活的设计模式是将接口对象作为方法的参数。这种方式为我们带来了许多好处,包括降低耦合性、实现多态性和可替换性、实现依赖倒置原则等。本文将深入探讨这种设计模式的优势以及在实际开发中的使用场景。将接口对象作为方法参数是一种强大的设计模式,它提高了代码的可维护性、可扩展性和可读性。通过实现多态性、降低耦合性、遵循依赖倒置原则等,我们能够写出更加优雅、灵活的Java代码。原创 2023-11-13 10:16:58 · 1543 阅读 · 0 评论 -
使用 CountDownLatch 实现多线程协作
在多线程编程中,经常需要实现一种机制来协调多个线程的执行,以确保某些操作在所有线程完成后再进行。CountDownLatch 就是 Java 并发包中提供的一种同步工具,它能够让一个或多个线程等待其他线程完成操作。CountDownLatch 和 CompletableFuture 都是 Java 中用于多线程协作的工具,它们各自适用于不同的场景。CountDownLatch 更适合简单的多线程协作,而 CompletableFuture 则更适合复杂的异步编程场景。原创 2023-11-07 10:46:07 · 189 阅读 · 0 评论 -
深入解析 Spring Framework 中 @Autowired 注解的实现原理
Autowired注解在Spring中的作用是实现依赖注入(Dependency Injection),它用于自动装配(autowiring)Spring Bean 的依赖关系。具体来说,@Autowired自动装配依赖:通过在类的字段、构造函数、方法参数等地方使用@Autowired注解,Spring 容器会自动识别需要注入的依赖,并将适当的 Bean 实例注入到目标组件中。减少手动配置:使用@Autowired。原创 2023-10-30 12:02:11 · 509 阅读 · 0 评论 -
群晖NAS中使用Docker安装MySQL数据库
在群晖NAS上使用Docker来安装和管理MySQL数据库是一种高效且方便的方式。通过Docker,您可以轻松地创建和管理多个独立的数据库实例,并且可以根据需要进行自定义配置。本文将指导您逐步完成在群晖NAS上安装MySQL的过程。至此,您已经成功在群晖NAS上使用Docker安装了MySQL数据库。通过Docker,您可以快速创建和管理多个MySQL实例,并根据需要进行自定义配置。祝您在使用MySQL数据库过程中取得好的效果!同时欢迎大家关注我的微信公众号:种棵代码技术树,公众号中有更多丰富内容。原创 2023-10-16 21:25:47 · 7257 阅读 · 0 评论 -
Docker常用命令详解
授之以鱼,不如授之以渔。原创 2023-10-16 20:42:52 · 63 阅读 · 0 评论 -
共生与共享:线程与进程的关系
在计算机科学和操作系统领域,线程(Thread)和进程(Process)是两个关键概念。它们之间存在密切的关系,但又有着明显的区别。本文将深入探讨线程和进程之间的关系,以及它们在并发编程和资源管理中的作用。进程是操作系统中的基本执行单元,它是一个正在运行的程序的实例。每个进程都有自己的独立内存空间、数据和执行环境。进程之间相互隔离,一个进程的崩溃通常不会影响其他进程的正常运行。进程提供了更高级别的隔离,使得不同进程可以独立运行,互不干扰。线程是进程内的执行单元,一个进程可以包含多个线程。原创 2023-10-12 22:00:08 · 1075 阅读 · 0 评论 -
关于Qualifier你要知道的二三事
当使用Spring框架进行Java应用程序开发时,可能会遇到ConflictingBeanDefinitionException异常。如:这个异常通常发生在以下情况下:在应用程序上下文中存在多个相同名称的Bean定义,导致Spring无法确定应该使用哪一个Bean。这个问题可能出现在团队协作开发中,特别是当不同的开发者在不同的模块中定义了相同名称的Bean时。在本文中,我们将探讨这个异常出现的原因、解决方案以及在团队协作开发中的编码建议。原创 2023-10-11 21:49:01 · 1644 阅读 · 0 评论 -
Spring Framework中的org.springframework.stereotype包:为你的应用程序定义“典型”
当使用Spring框架进行Java应用程序开发时,可能会遇到ConflictingBeanDefinitionException异常。如:这个异常通常发生在以下情况下:在应用程序上下文中存在多个相同名称的Bean定义,导致Spring无法确定应该使用哪一个Bean。这个问题可能出现在团队协作开发中,特别是当不同的开发者在不同的模块中定义了相同名称的Bean时。在本文中,我们将探讨这个异常出现的原因、解决方案以及在团队协作开发中的编码建议。原创 2023-10-10 21:11:26 · 1122 阅读 · 0 评论 -
团队协作中如何处理ConflictingBeanDefinitionException异常
当使用Spring框架进行Java应用程序开发时,可能会遇到ConflictingBeanDefinitionException异常。如:这个异常通常发生在以下情况下:在应用程序上下文中存在多个相同名称的Bean定义,导致Spring无法确定应该使用哪一个Bean。这个问题可能出现在团队协作开发中,特别是当不同的开发者在不同的模块中定义了相同名称的Bean时。在本文中,我们将探讨这个异常出现的原因、解决方案以及在团队协作开发中的编码建议。原创 2023-10-09 22:02:59 · 1680 阅读 · 0 评论 -
什么是EJB以及和Spring Framework的区别
EJB,对于新生代程序员来说,是一个既熟悉又陌生的名词,EJB,大家都听说过,但是不一定都了解过,EJB是一种开发规范,而不是像Spring Framework一样是一个开源框架,EJB需要大量的XML配置和编码,增加了开发人员的工作负担,学习曲线相对陡峭,因此逐步被ssh取代,而后是s2sh 、ssm、 到现在的springboot微服务。在 Java 企业应用程序开发中,EJB(Enterprise JavaBeans)和 Spring Framework 都是两个重要的技术选项。原创 2023-10-08 11:22:46 · 1886 阅读 · 0 评论 -
IntelliJ IDEA失焦自动重启服务的解决方法
当我们勾选Update classes and resources,当IDEA失焦时,IDEA便会自动更新classes and resources文件,重新编译Spring Boot工程重启服务,因此,如果你不想使用IDEA默认的方案,修改IDEA失焦后的动作为Do nothing或Update resources,修改完成后,点击Apply或OK即可。尽管这并不一定妨碍你的项目运行,但是它无疑会打断你的开发流程,特别是当你在进行长时间的任务时。打开IDEA的Configuration。原创 2023-10-07 13:55:18 · 1936 阅读 · 0 评论 -
服务器CPU飚高排查
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。线程等待:jstack 可以显示线程的等待状态,帮助您确定是否存在线程等待某个资源的情况。线程状态监控:jstack 提供了对线程状态的监控,您可以了解线程的状态,如运行、阻塞、等待等,以便更好地理解应用程序的运行情况。使用arthas可以更快定位问题代码行。原创 2023-08-20 21:47:25 · 1210 阅读 · 1 评论 -
Spring中的IOC与DI-细胞内物质与传递
在实际应用中,我们应该根据查询的需求和性能要求,谨慎选择合适的操作符,以提高查询效率。最后,值得注意的是,优化查询性能是一个复杂的过程,还涉及到其他因素,如索引的设计、统计信息的准确性以及查询语句的编写等。通过选择适当的操作符和实施综合的优化措施,我们可以提高数据库查询的效率,提升应用性能,为用户提供更好的体验。在SQL查询中,当我们需要合并多个查询结果集时,我们通常会使用UNION和UNION ALL操作符,同时,如果你写的or语句不走索引,可以考虑使用UNION、UNION ALL优化。原创 2023-08-18 23:04:17 · 342 阅读 · 0 评论 -
无感知发布
在实际应用中,我们应该根据查询的需求和性能要求,谨慎选择合适的操作符,以提高查询效率。最后,值得注意的是,优化查询性能是一个复杂的过程,还涉及到其他因素,如索引的设计、统计信息的准确性以及查询语句的编写等。通过选择适当的操作符和实施综合的优化措施,我们可以提高数据库查询的效率,提升应用性能,为用户提供更好的体验。在SQL查询中,当我们需要合并多个查询结果集时,我们通常会使用UNION和UNION ALL操作符,同时,如果你写的or语句不走索引,可以考虑使用UNION、UNION ALL优化。原创 2023-08-18 10:53:11 · 405 阅读 · 0 评论 -
线程安全的单例模式实现方式
在实际应用中,我们应该根据查询的需求和性能要求,谨慎选择合适的操作符,以提高查询效率。最后,值得注意的是,优化查询性能是一个复杂的过程,还涉及到其他因素,如索引的设计、统计信息的准确性以及查询语句的编写等。通过选择适当的操作符和实施综合的优化措施,我们可以提高数据库查询的效率,提升应用性能,为用户提供更好的体验。在SQL查询中,当我们需要合并多个查询结果集时,我们通常会使用UNION和UNION ALL操作符,同时,如果你写的or语句不走索引,可以考虑使用UNION、UNION ALL优化。原创 2023-08-15 21:53:46 · 586 阅读 · 0 评论 -
优化查询性能:UNION与UNION ALL的区别
在实际应用中,我们应该根据查询的需求和性能要求,谨慎选择合适的操作符,以提高查询效率。最后,值得注意的是,优化查询性能是一个复杂的过程,还涉及到其他因素,如索引的设计、统计信息的准确性以及查询语句的编写等。通过选择适当的操作符和实施综合的优化措施,我们可以提高数据库查询的效率,提升应用性能,为用户提供更好的体验。在SQL查询中,当我们需要合并多个查询结果集时,我们通常会使用UNION和UNION ALL操作符,同时,如果你写的or语句不走索引,可以考虑使用UNION、UNION ALL优化。原创 2023-08-14 15:34:36 · 1199 阅读 · 0 评论 -
从源码分析常见集合的区别之List接口
List接口实现自接口,是Java的集合框架中的一员,List接口下又有和线程安全的,今天就简单分析一下和的异同以及各自的优势。原创 2023-08-14 15:14:47 · 440 阅读 · 0 评论 -
MySQL不走索引的情况分析
innodb表的统计信息并不是实时统计更新,如果统计信息和实际的索引信息差异很大,就会导致优化器计算各个索引成本后,做出非预期的选择。出现这种现象的场景是:当有大量数据在短时间内落库时,Innodb还没更新统计相关信息,此时来了一个查询,MySQL会基于历史数据做出错误的判断:当前表数据量少,不走索引更高效。回表操作可能会增加额外的磁盘访问和数据检索的开销,因此,在某些情况下,当MySQL判断回表所需的资源大于直接扫描全表时,它可能选择不走索引,而是执行全表扫描。查询频繁是数据表字段增加合适的索引。原创 2023-08-11 22:42:22 · 1419 阅读 · 0 评论 -
SpringBoot MDC全局链路解决方案
Filter是Java Servlet 规范定义的一种过滤器接口,它的主要作用是在 Servlet 容器中对请求和响应进行拦截和处理,实现对请求和响应的预处理、后处理和转换等功能。通过实现 Filter 接口,开发人员可以自定义一些过滤器来实现各种功能,如身份验证、日志记录、字符编码转换、防止 XSS 攻击、防止 CSRF 攻击等。那么这里我们使用它对请求做MDC赋值处理。原创 2023-08-08 22:12:52 · 1090 阅读 · 0 评论 -
Merge和Rebase的区别
变基的结果是源分支上的提交被重新应用到目标分支上,创建了新的提交。变基是将一个分支的提交移动到另一个分支的末尾,使提交历史看起来像是在一个分支上进行的连续修改。Merge 保留了分支的独立提交历史,而 Rebase 则将分支的提交移动到其他分支的最新提交之后,使提交历史保持线性。需要注意的是,当使用 Rebase 时,由于修改提交历史的特性,可能需要解决冲突,并且可能会导致其他开发者基于原始提交历史构建的分支出现问题。合并的结果是一个新的提交,它将源分支的修改合并到目标分支中。原创 2023-08-08 11:51:22 · 1142 阅读 · 0 评论 -
服务器排查并封禁ip访问
购买的服务器难免会遇到被攻击的情况,当我们发现服务器状态异常时,可以通过连接当前服务器的ip排查一下,并对可疑ip进行封锁禁止。我们可以通过路由跟踪来查看可疑ip。以下是两种解决方案。原创 2023-08-06 15:04:37 · 863 阅读 · 1 评论 -
百万数据分页查询优化方案
分页列表查询是项目中的热点需求,这种需求的特点是:字段多、数据量大、访问频繁、使用率高的特点,这个功能是给用户最直观的展示系统的信息,针对于多、大、频、热这几个特点,会引申出一个问题:列表展示的数据可能是来自于不同的数据维度、需要关联N张表查询得到,那么,如何让用户更快、更准的获取到需要的数据,便成了程序员在编码时需要考虑到并且需要解决的问题,因为随时间推移,线上系统不乏几百万数据的表。实际的业务场景下,可能会关联N张表,而且线上服务器的压力会比单机开发环境更重,因此实际接口响应时间会更长。原创 2023-07-26 08:38:56 · 489 阅读 · 0 评论 -
矛与盾-数据库被攻击恢复方案
开发者通常会购买自己的服务器去搭建一套自己的开发环境,由于服务器防护等级较低、弱密码或者疏于防护,服务器更容易遭到攻击者攻击。数据库被攻击是一种非常常见的网络安全问题,黑客通过利用漏洞或弱密码等手段进入您的服务器并获取敏感数据,这些数据可能包括个人身份信息、财务信息和其他敏感信息。黑客可能会将您的数据窃取、删除或加密,使您无法访问或使用它们。原创 2023-07-22 23:36:05 · 378 阅读 · 0 评论 -
Easy Excel参数校验实现
在导入需求中,往往要求用户输入值的合法性,如是否为空的校验、正则校验、存在性校验,在以往实现方案中,通常是使用for循环来实现的,但是在Excel工具解析文件的过程中,其实已经逐行解析数据过一遍,如果在业务逻辑中再次for循环读取一次,实则是没有必要的,因此,我们可以使用Easy Excel提供AnalysisEventListener监听器实现。在解析过程中,当 SAX 解析器读取到每个单元格数据时,EasyExcel 会触发相应的事件,并将读取到的数据传递给监听器进行处理。原创 2023-07-03 21:54:56 · 2003 阅读 · 0 评论 -
@ControllerAdvice如何实现@RestControllerAdvice的异同
在异常处理和统一响应处理方面的功能类似,只是注解的使用场景和响应格式有所不同。如果你的应用程序是基于MVC架构的传统应用,可以使用。如果你的应用程序是基于RESTful风格的API应用,可以使用。原创 2023-05-24 09:36:30 · 612 阅读 · 0 评论 -
(二)、Elasticsearch-基本单元
索引是文档的容器,是一类文档的结合。概念类似于Java中的类,那么与之对应MySQL的表。字符串、数值、布尔、日期、二进制、范围类型。每个文档都有一个Unique ID。元数据用于标注文档的相关信息。原创 2023-05-21 21:43:10 · 401 阅读 · 0 评论 -
Git最佳实践-Git flow
提高团队协作效率,人人有责。原创 2023-02-02 11:55:43 · 407 阅读 · 0 评论 -
List subList()方法缺陷及替代方案
方法是通过下标来获取原数组的数据,而不是返回一个新的对象,当代码中有对分割后的列表访问时,便是对原。因此,我们需要找到新的方案去解决代码中的风险点。的构造方法中,入参有原始list的引用,在日常开发中,我们常遇到将一个。使用Stream的方式分割。方法避免开发者重复造轮子。的引用,导致该对象不会被。回收,数据量大时,有导致。列表分割成多个的场景,的一个内部类,它继承自。使用方法参考示例来自。原创 2023-01-13 20:05:08 · 2429 阅读 · 0 评论 -
MySQL--什么情况下不建议使用join查询
当需要查询两个表的交集、并集等数据时,除了嵌套子查询的方式外,还可以使用join的方式提升性能。对于MySQL的join语句,需要两个最基础的“角色”:主表即驱动表,关联表即驱动表。当被驱动表无可用索引时,在驱动表得到一行数据后,需要拿着该数据去被驱动表扫描全表逐行匹配数据,假设驱动表有N行数据,被驱动表有M行数据,那么扫描总行数则为:N*M行。如果驱动表与被驱动表均有十万行数据,则需要扫描100亿行。在本策略中,驱动表在where条件筛选完毕后,会扫描全表,被驱动表走索引的树搜索。原创 2023-01-10 15:36:27 · 528 阅读 · 0 评论