自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(395)
  • 收藏
  • 关注

原创 Spring事务同步器(TransactionSynchronizationManager)+ 事务钩子函数的使用案例

在实际开发中,通常会有这样的需求,主线程执行业务逻辑后需要发送异步消息到MQ或者需要执行异步线程任务,此时可能主线程的事务还没提交,就会导致在异步任务中查询不到主线程写入库的数据,因此这里需要使用Spring提供的事务同步器和事务钩子函数来解决这个问题。【2】声明式事务中也可以使用 TransactionSynchronizationManager.isSynchronizationActive() 判断当前线程是否有事务,有事务则注册事务同步器执行事务回调函数,将异步任务放在回调钩子函数中执行即可。

2025-06-11 15:30:00 10

原创 windows电脑解决笔记本搜索不到wifi问题

windows笔记本电脑明明打开了wifi功能,却搜索不到wifi,此问题可能是网络适配器被禁用的原因导致,通过以下方法也许能解决,无需重启电脑。1、右键点击网络或wifi图标,打开界面”网络和internet“3、启用WLAN,然后重新打开wifi连接即可。2、选择”高级网络设置“

2025-06-11 14:00:00 164

原创 Java中方法调用参数传递机制的理解和示例验证

在Java中,方法调用参数的传递机制是值传递,对引用类型传递的是引用的副本(不是真正的引用传递),也就是说在被调用方法中对参数引用副本重新赋值不会影响原始引用。【2】如果传递是引用类型,则传入的是原始引用副本(不是原始引用),更改引用副本内容会影响原始引用的值,但重新赋值不会影响原始引用(只在当前方法中生效)【1】重新赋值参数会影响调用方的变量:只有更改对象内容有效,重新赋值引用无效。【1】如果传递是基本类型,则直接传递值的副本,方法内重新赋值不会影响原始值。输出结果:2,3,4。

2025-06-09 14:30:00 94

原创 Java中异步编程 CompletableFuture.allOf()、CompletableFuture.get()、CompletableFuture.join() 的使用案例和适用场景

【2】CompletableFuture.get() 和 CompletableFuture.join():此二者方法都是用于阻塞主线程(调用线程),等待所有任务完成并获取结果。【1】在使用 CompletableFuture.allOf() 组合任务后,通常需要阻塞主线程(调用线程)等待任务完成。【2】优先推荐使用 allOf.join(),此方法可以更灵活的用于链式任务中获取结果。【1】CompletableFuture.allOf():用于组合多个异步任务。

2025-06-09 10:12:13 306

原创 Spring中过滤器 RequestContextFilter 和 OncePerRequestFilter 的区别

在Spring中,RequestContextFilter 和 OncePerRequestFilter 都是处理HTTP请求的关键组件,但它们的职能和使用场景有着不同的区别。【3】实现原理是通过 ThreadLocal 存储 ServletRequestAttributes 的属性值,以供当前整个请求线程生命周期内可以直接访问上下文信息,而无需通过方法参数传递。确保每个请求的过滤逻辑仅执行‌一次,@Order(1)确保改过滤器逻辑优先执行。【2】适用于请求只需要执行一次过滤逻辑的场景。

2025-05-30 14:30:00 153

原创 Java中删除文件、删除文件所在的目录,递归删除文件夹目录中的文件

一、删除文件、删除文件所在的目录,示例代码。二、递归删除文件夹目录中的文件,示例代码。

2025-05-30 10:00:00 169

原创 java中什么情况会导致 OOM(内存溢出)

OOM(OutOfMemoryError)是 JVM 内存不足无法为新对象分配内存抛出的严重错误,会导致‌应用崩溃、服务中断、性能骤降‌等问题。3、ThreadLocal、MDC等线程传递或共享变量使用后没有进行清理。1、代码中出现死循环空转、大量创建大对象等。2、资源未关闭,如:文件流、IO流。

2025-04-17 15:00:00 255

原创 java中什么情况会触发FullGC,如何避免频繁FullGC

2、选择合适的 GC 回收器,推荐(G1GC、ZGC)。避免使用CMS(该回收器已被弃用,且该回收器会导致内存碎片化,从而导致堆内存不足而触发FullGC)FullGC 为全量垃圾回收(完全垃圾回收),是 JVM 性能问题的典型信号,会直接影响应用的‌稳定性、吞吐量‌和响应速度‌。【1】频繁 FullGC(尤其是使用CMS”并发-标记-清除“算法的垃圾回收器)可能导致堆内存碎片化。【2】碎片化导致可用内存不足,即使总内存足够,仍会导致OOM(内存溢出)或触发FullGC。【3】系统整体处理能力降低。

2025-04-17 10:30:00 862

原创 shardingsphere-jdbc集成Seata分布式事务

【1】shardingsphere-transaction-base-seata-at 的版本最好与 shardingsphere-jdbc 版本一致。(1)事务组名称可以自定义,但要与seata服务端配置文件(seata-server.yml)中配置的事务组名称一致(否则报错),【1】shardingsphere-jdbc 集成 seata 与 单数据源集成 seata 完全是各自独立的方式(不搭嘎)【2】在被调用方的服务中配置 seata 支持的事务传播拦截器,获取调用方传递过来的 TX_XID。

2025-04-16 14:30:00 584

原创 Docker部署安装Seata 2.2.0

【1】mysql-connector-j-9.1.0.jar 传入到 lib 目录下(/seata-2.2.0/seata-server/lib)5、把上述的文件 mysql-connector-j-9.1.0.jar、Dockerfile 分别传入Seata解压后的项目中。【2】apache-seata-2.2.0-incubating-src.zip 为了方便找到脚本、配置文件等。【1】apache-seata-2.2.0-incubating-bin.tar.gz 用来构建镜像。

2025-04-16 10:00:00 214

原创 SpringBoot项目集成Seata 2.0.0

【1】tx-service-group:事务组的主要作用是用于服务发现TC(事务协调器)服务集群,TC管理事务的提交或回滚。如果多个服务用同一个事务组可能会导致TC负载过高、事务管理混乱等问题。【4】必须在集成 seata 服务对应的数据库中创建 undo_log 表,【3】vgroup-mapping:注意事务组映射关系,不能配置错。【1】经测试验证,调用链全局事务可以正常回滚。被调用方正常开启分支事务(本地事务)即可。1、需要提供以下服务。【1】nacos服务。【2】seata服务。

2025-04-10 15:30:00 554

原创 Docker迁移root目录(根目录)至新的目录,可解决因docker目录磁盘空间满了导致容器无法运行、崩溃等问题

1、Docker 的根目录是指 Docker daemon 存储镜像、容器和所有相关文件的地方,Docker服务的默认存储目录位于 /var/lib/docker,如果需要新的目录(更大的磁盘分区或自定义路径)通常需要迁移到空间更大的目录。使用 rsync 将原数据完整复制到新目录(例如新目录为 /home/docker),大概需要等待几分钟时间。2、Docker 会为每个容器创建⼀个单独的目录,该目录包含该容器所需的所有文件系统内容。【2】data-root:对应的目录要确保存在。6、查看是否迁移成功。

2025-04-10 10:30:00 312

原创 windows系统桌面快捷箭头去掉、恢复方式,支持win10、win11

将上述代码放入txt文件中,然后改为bat文件,直接双击执行即可。将上述代码放入txt文件中,然后改为bat文件,直接双击执行即可。一、windows 11。二、windows 10。

2025-04-09 15:30:00 477

原创 SpringBoot配置上传文件临时解析处理目录、临时存储目录

spring.servlet.multipart.location 是 Spring Boot 中用于‌配置文件上传时临时存储目录‌的关键属性。它的作用是为 HTTP 多部分请求(文件上传)生成的临时文件指定存储路径。支持 multipart/form-data 类型的 HTTP 请求(例如表单文件上传),确保文件在写入临时目录后能被正确解析和处理。当客户端上传文件时,Spring 会先将文件内容写入磁盘的临时目录(而不是直接加载到内存),避免大文件占用过多内存。【1】确保应用对指定目录有‌读写权限。

2025-04-09 10:00:00 203

原创 Java设计模式-单例模式

【3】存在的问题:JVM可能对(分配内存空间、初始化对象、赋值)进行指令重排序打乱顺序,导致其他线程在第一次判空时看到 instance!【2】instance = new Singleton():实例化对象分为3个阶段:分配内存空间、初始化对象(调用构造函数)、将变量instance指向内存地址。【1】线程安全:JVM 保证枚举实例的初始化是线程安全的(静态块加载)【3】防序列化破坏:枚举的序列化机制天然保证反序列化时不会生成新实例。【2】防反射攻击:Java 禁止通过反射创建枚举实例。

2025-04-08 15:30:00 177

原创 git项目pull报错Cannot check the working tree for unmerged files because of an error.

一、报错信息:Cannot check the working tree for unmerged files because of an error。检查,防止在权限不明的目录中执行命令。1、Git 2.36+ 引入了。

2025-04-08 10:00:00 518

原创 java中自动转义分割或动态分割文件对象路径【path.split(Pattern.quote(FileUtil.FILE_SEPARATOR))】,分割结果为数组或集合

若直接使用 split(FileUtil.FILE_SEPARATOR) 代码实际会变成 split("\"),导致语法错误。【4】FileUtil.FILE_SEPARATOR 返回的分隔符(如 \ 或 /)在正则中有特殊含义,需转义后才能正确分割:Pattern.quote(FileUtil.FILE_SEPARATOR)【1】建议首先获取文件对象,通过文件对象 file.getPath() 获取文件路径。

2025-04-07 15:00:00 49

原创 MySql 主从复制,常见的问题

【2】master_auto_position 启动GTID自动定位,如果处于1启动状态则主从链路无法设置(master_log_file、master_log_pos)等信息。slave-skip-errors 的取值可查看 Last_SQL_Errno 的值,与之对应。【2】分别重启mysql服务后,在从服务更新主从链路信息(启用 GTID 自动定位)3、配置主服务器,修改my.cnf文件,允许非 SSL 连接(关闭安全连接)【1】master_auto_position 对应的值:1-开、0-关。

2025-04-07 10:30:00 435

原创 集成 shardingsphere-jdbc 常见问题

1、sharding.yml 文件中配置项要求非常严格,注意属性缩进、最好也不要出现汉字(包括注释汉字)、不能配置 shardingsphere-jdbc 不需要的额外其他属性。【2】actualDataNodes:把逻辑表映射到实际表命名规则。语法:数据源逻辑名_序号索引值.逻辑表名称_序号索引值,示例:ds_${0..1}.t_${0..1}【1】t:是逻辑表名称(一般取表前缀),逻辑表和实际表映射。【1】不配置此项加载单表,则会报错。2、违反1规则,可能会报错。

2025-03-29 14:30:00 340

原创 SpringBoot3.x 集成 shardingsphere-jdbc 实现读写分离

【1】jdbc:shardingsphere:classpath:是数据源配置文件路径的前置固定写法,后面sharding-config.yml是刚才创建的数据源配置文件目录和名称。3、打开 bootstrap.yml 文件,添加 ShardingSphereDriver 驱动,以及数据源配置文件的路径。1、在 resources 目录下创建 sharding-config.yml 文件,并添加配置信息。【2】读写库配置、负载均衡规则、分片配置逻辑表等。【3】不同数据源对应的url属性有所不同,说明。

2025-03-29 10:30:00 355

原创 docker部署安装Seata服务

该文件 application.yml 在 seata 项目的 seata\conf\application.yml 目录下,以及配置案例文件(application.example.yml)2、在nacos配置中心,创建 seata-server.properties 或 seata-server.yml 配置文件。【1】脚本可以在我们前面下载的seata项目包的 seata\script\server\db\mysql.sql 找到。【2】SEATA_IP:用于注册中心seata实例的ip。

2025-02-23 15:30:00 200

原创 解决seata服务常见异常问题

【1】docker创建容器时,显示的分配内存即可 -e JVM_XMS=256m -e JVM_XMX=512m。一、错误信息,此问题可能会出现在docker或k8s部署seata服务时出现。【1】看日志信息,很明显无法分配内存。

2025-02-23 14:00:00 160

原创 MySQL中ddl操作或创建索引防止锁表的一些建议或解决方案

【说明】目前没有任何一种办法可以保证在DDL操作下能完全避免锁表。(1)lock的可选项除了 none,还可以使用 shared(共享锁:允许读操作,但会阻塞写操作)【说明】使用 algorithm = inplace 原地算法,减少对数据库性能的影响。(2)在生产环境中对数据量较大的表进行DDL操作,选择在流量较小的时段执行较为合适。【说明】使用 lock = none 明确告诉MySQL在创建索引时不锁表。(1)建议在生产环境中进行任何重大DDL更改,都要在测试环境充分测试验证。

2025-02-17 15:00:00 425

原创 SpringBoot项目中不启动(不添加) @EnableAspectJAutoProxy 注解,AOP功能还生效吗

1、@EnableAspectJAutoProxy 是Spring框架的一个注解,其主要作用是启用AspectJ的自动代理功能,告诉Spring容器,我们希望使用AspectJ的注解来定义切面,并希望Spring容器能够自动为这些切面目标创建代理对象。2、主启动类启动 @EnableAspectJAutoProxy 之后,项目启动时,会扫描所有标注了 @Aspect 的类,并注册到Spring容器中。2、主启动类不启动 @EnableAspectJAutoProxy。

2025-02-17 11:00:00 93

原创 Java中 volatile、atomic、synchronized 关键字的作用

【2】指令重排序是指编译器和JVM为了提高程序执行效率而采用的一种优化手段,但在多线程环境中,它可能会导致程序出现意料之外的行为。【2】在多线程环境中,一个线程对共享变量的修改后如果需要及时地被其他线程看到最新的值。【1】原子性:atomic 类中的操作都是原子的,原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就会在不受其他线程干扰的情况下一直执行到结束。【2】atomic 原子性保证了在多线程环境下,即使多个线程同时尝试修改同一个 Atomic 对象的状态,也不会导致数据不一致的问题。

2025-02-11 15:00:00 61

原创 JMM(Java Memory Model)Java内存模型

1、Java内存模型(Java Memory Model,JMM)是Java虚拟机定义的内存访问规范,用于屏蔽底层硬件和操作系统的内存访问差异,达到内存访问一致性的目的。1、可见性:一个线程对共享变量的修改,能够及时地被其他线程看到。JMM通过规定主内存与工作内存之间的交互操作,使用 volatile 修饰共享变量确保变量的可见性。2、解决多线程环境下共享变量的可见性、原子性和有序性问题,规定了共享变量如何在多线程之间共享。【工作内存】:每个线程独有的一个存储区域,用于存储线程私有数据和共享变量的副本。

2025-02-11 10:30:00 186

原创 Java21虚拟线程的概念和基本使用、以及和传统线程的对比

在 Java 21 中,虚拟线程作为一项全新的功能被引入,与传统线程相比,虚拟线程不仅在内存占用和创建开销上更为轻量,而且能更高效地支持 I/O 密集型应用,极大地提升并发处理能力。1、经验证,虚拟线程性能还是非常强的,但和 Spring 提供的 ThreadPoolTaskExecutor(AsyncTaskExecutor)线程池相比,虚拟线程还是稍逊一筹。首推还是使用虚拟线程,因为虚拟线程属于逻辑层面的线程,和物理机器无关,因此可以随时创建大量的线程也不会占用过多的内存和资源消耗。

2025-01-24 14:15:00 205

原创 Spring AOP 和 AspectJ AOP 的区别和使用场景

如果你需要增强 final 方法、static 静态方法、字段访问、构造器调用等,或者需要在非 Spring 容器管理的对象上应用增强逻辑,AspectJ 是唯一的选择。(2)Spring AOP 是基于动态代理实现的增强,仅支持增强 Spring 容器内管理的 Bean 实例对象,不支持增强 final 和 staic 修饰的方法。1、AspectJ 是通过直接操作字节码来实现的增强,它不依赖于代理对象,能够直接对目标类的字节码进行修改。(3)AspectJ 可以增强非 Spring 容器管理的对象。

2025-01-24 10:15:00 131

原创 SpringBoot 3.x集成 jakarta mail 实现发送邮件

【2】发送者名称需要做转义处理,完整转义示例:String from = "\"" + senderName + "\"" + " " + "<" + senderEmail + ">";【1】mailAccount.setFrom():支持解析格式(双引号包裹名称 + 尖括号包裹地址):"\"发送者名称\" <[email protected]>"3、如上示例只验证了简单内容的邮件,也支持附件、HTML内容、抄送等邮件。MailConfig 类。MailUtil 工具类。验证结果:皆成功收到邮件。

2025-01-20 14:30:00 394

原创 解决:SpringBoot集成mail服务项目启动报错 Failed to instantiate [MailSenderValidatorAutoConfiguration]: Constructo

出于安全考虑,某云服务器默认封禁了TCP25端口出方向的访问流量,无法在某云上的云服务器通过TCP25端口连接外部地址。

2025-01-20 10:00:00 184

原创 搭建redis集群常见的问题及解决

(1)错误信息[ERR] Node is not empty表明您尝试创建Redis集群时,指定的节点不为空。这可能意味着该节点已经是另一个集群的一部分,或者它包含数据库0中的一些键。在确保服务是已启动的情况下,却连接不上,此时就可以排查是不是云服务器的端口开放问题,一般在云服务防火墙规则下放开允许端口号就可以了。(2)shutdown原节点,删除该节点对应的 nodes-800x.conf 文件,启动该节点服务。最后重新创建集群即可。一、在集群节点启动后,客户端连接登录或创建集群的时候报如下错误。

2025-01-13 10:30:00 268

原创 解决idea中无法拖动tab标签页的问题

2、去掉勾选 Drag-and-drop with Alt pressed only 即可。1、按 Ctrl + Alt + S 打开设置,找到路径。

2025-01-10 14:30:00 655

原创 mysql实现对字符列第一个汉字首字母拼音进行A-Z顺序排序,使用gbk编码

在特殊场景中,需要对某列进行排序,预期是按照汉字拼音首字母进行排序,如果使用字段直接排序会发现不符合预期,那么需要做一些特殊处理。2、如果使用 conver() 执行时日志输出有报错,推荐使用 cast() 函数对第一个汉字编码类型转换为 gbk 后,再进行排序。1、使用 convert() 函数对第一个汉字编码类型转换为 gbk 后,再进行排序。从结果可以看出,符合预期排序。从结果可以看出,符合预期排序。从结果看,很明显不符合预期。

2025-01-10 10:30:00 554

原创 windows系统安装mysql,版本[8.3.0、9.0.1](压缩包方式)

(2)也可以指定 datadir=D:\xxx\xxx\data,datadir 为数据或日志文件存放目录地址。1、解压后,将安装目录下的bin添加至系统环境变量 PATH 路径中。(1)这里不需要指定 datadir=D:\xxx\xxx\data。1、切换目录至mysql主目录的bin文件夹下,执行cmd命令。1、默认密码是随机串不好记,登录mysql数据库修改密码。2、执行后输出信息,需要记录生成的默认 root 密码。2、修改,例如将密码修改为 root123。4、删除对应的安装目录文件。

2024-12-30 10:30:00 862

原创 windows(win)系统盘C盘(系统盘)爆满,优化方式

(1)完成如上操作,会释放C盘空间,提升电脑响应速度。1、打开控制面板,在右上角搜索框输入索引。2、点击索引选项,打开后选择高级按钮。3、点击重建,然后点击确认。

2024-12-29 14:30:00 336

原创 java中常用的初始化动作 static代码块、无参构造方法的区别

(2)只不过实例化Chil时除了本身的static块和无参构造方法会执行,其父类的也会执行,执行时序与规则一模一样。(1) 由结果可以看出,实例化对象,static代码块只会执行一次,无论实例化多少次,也只执行一次。3、static代码块在类加载时候执行,所以static代码块执行的优先级高于构造代码块。1、static代码块是在类加载时执行的,且只执行一次。(2)而无参构造方法,则跟随实例化次数,每实例化一次会跟随执行一次。2、而构造方法,则是跟随实例化次数,每实例化一次会跟随执行一次。

2024-12-29 10:30:00 69

原创 安装MySql服务集群,主从复制模式,MySql 8.x为例

主从复制是一种异步复制模式,允许将一个主数据库的数据复制到一个或多个从数据库,所有的写操作都在主数据库上执行,而从数据库主要用于读操作。1、在大型互联网系统、高并发场景中,Mysql主从复制用于实现读写分离,可以有效减轻主库负载压力。4、查看 server-id 的值,必须为上面设置的2,否则请返回修改配置文件。2、锁定数据表并导出数据库,在配置从服务器之前,需要确保数据的一致性。1、修改 my.cnf 配置文件,在 [mysqld] 下添加。1、在主服务登录 mysql ,创建复制专用用户,并赋予权限。

2024-12-29 03:50:28 385

原创 git在idea中操作频繁出现让输入token或用户密码,可以使用凭证助手(使用git命令时输入的用户密码即可) use credential helper

2、勾选 Use credential helper 即可。1、打开 idea 设置,找到 git 路径。

2024-12-28 14:30:00 1155

原创 idea新版ui外观习惯设置

1、调出常用功能窗口,如 Project、Services、Git等。3、选择 Version、Git下面对应的操作即可。【1】还可以自定义菜单图标,一般用默认图标就可以了。1、显示边栏功能快捷按钮,可以迅速在找到对应功能。2、选择 Right、点击 Add Action。将git的常用操作放在右上角,操作更方便快捷。1、选择 Customize TooBar。1、在底部栏目右键,选中对应要显示的即可。1、在ui顶部右键,选择。

2024-12-28 10:30:00 1266 1

原创 java中线程 Thread.join() 的作用

2、一个线程使用join()方法、一个线程不使用join()方法,结果使用 join() 方法可以正确赋值主线程的变量,不使用 join() 方法无法正确赋值主线程变量。具体来说,当一个线程调用了另一个线程的join方法后,当前线程会暂停执行,直到被join的线程执行完毕。3、得出结论,thread.join() 方法具有等待作用,也就是主线程会等待调用join()方法的子线程执行完毕后,主线程才会继续执行。1、由结果可以看出,由两个子线程给父线程(主线程)中的name变量赋值。

2024-12-24 14:30:00 198

空空如也

空空如也

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

TA关注的人

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