自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 git merge 与 rebase 分支整合的区别及选择

Git中merge和rebase各有特点:merge保留完整分支历史但可能杂乱,适合团队协作;rebase生成线性历史但会重写提交记录,适合本地分支整理。推荐实践:功能分支用rebase同步主分支更新,最终合并到主分支时用merge。团队项目优先选merge,追求简洁历史时可考虑rebase,根据实际需求选择工具。

2025-11-07 19:49:21 355

原创 git stash push 命令作用及使用场景

Git stash push -m "保存信息"命令用于临时保存工作区的修改。该命令将未提交的更改暂存起来,并允许添加描述信息以便后续识别。适用于以下场景:紧急任务切换分支时保存半成品代码、拉取远程更新前保持工作区整洁、尝试不同实现方案时保留当前进度。恢复储藏可使用git stash apply(保留记录)或git stash pop(恢复并删除最近记录)。

2025-11-07 19:27:04 263

原创 Java 锁机制深度解析

文章摘要 公平锁与非公平锁的核心区别在于获取顺序:公平锁按请求顺序分配,非公平锁允许插队。公平锁保证公平性但性能较低,非公平锁吞吐量高但可能产生饥饿。锁优化技术包括:减少锁持有时间(只同步关键代码)、减小锁粒度(分段锁)、锁分离(读写锁)、锁消除(JVM优化局部锁)和锁粗化(合并连续锁操作)。示例代码展示了ReentrantLock的公平/非公平实现及各种优化技术的应用场景。

2025-10-17 10:46:40 416

原创 ForkJoinPool 核心的任务分配与执行

摘要:ForkJoinPool采用工作窃取算法和双端队列设计来高效执行任务。其核心机制通过任务分配与执行流程图清晰展示,实现线程间的负载均衡。这种设计显著提升了并行计算效率,特别适合处理可分解的递归任务。

2025-10-16 21:14:59 253

原创 Spring Batch 容错机制分析

摘要:Spring Batch处理chunk事务时,通过Retry和Skip机制确保批处理可靠性。Retry成功时事务继续提交;Skip未超限时跳过错误数据并提交事务,超限则回滚整个chunk。最佳实践建议将Retry用于临时错误恢复,Skip处理不可修复的坏数据,二者结合可增强批处理的健壮性。(149字)

2025-10-13 16:24:38 454

原创 Spring Boot 自动配置之 Spring transaction

Spring事务是Spring框架提供的统一事务管理机制,保障数据操作的一致性和完整性。Spring支持声明式(@Transactional)和编程式(TransactionTemplate)两种事务管理方式。TransactionAutoConfiguration是SpringBoot自动配置事务的核心类,它会根据条件自动配置TransactionTemplate和事务代理机制。当容器存在PlatformTransactionManager时,自动创建TransactionTemplate;同时通过@En

2025-09-29 17:13:00 985

原创 Spring Boot 自动配置之 Jackson ObjectMapper

是 Jackson 库的核心类,用于在Java 对象与 JSON 字符串之间进行序列化和反序列化。它常用于 Web 接口数据交互、配置文件解析、日志输出等场景,帮助开发者方便地在 Java 与 JSON 世界之间转换数据。

2025-09-29 12:13:40 365

原创 Spring Boot 自动配置之 Spring‘s AOP

Spring AOP核心机制摘要: 基于运行时代理实现(JDK动态代理/CGLIB),默认仅拦截容器管理的Bean的public方法 借用AspectJ注解语法(@Aspect等)但无需其编译器 自动配置逻辑: 默认开启(spring.aop.auto=true) 存在AspectJ依赖时,根据proxy-target-class配置选择代理方式(false用JDK,true/默认用CGLIB) 无AspectJ依赖时默认强制CGLIB代理 关键配置类AopAutoConfiguration通过条件注解实现

2025-09-28 11:26:40 482

原创 Spring Boot 自动配置之 TaskExecutor

摘要:Spring的TaskExecutor是对Java线程池的封装,用于异步执行任务,提升系统并发能力。通过@Async注解可实现方法异步化,自动配置的线程池Bean名为"applicationTaskExecutor"。默认配置存在风险(如无界队列),可通过yaml或自定义ThreadPoolTaskExecutorCustomizer优化参数:设置核心/最大线程数、队列容量、线程名前缀等。典型应用场景包括异步处理、批量操作和后台任务。需注意@Async要配合@EnableAsync

2025-09-26 16:18:11 620

原创 Spring Boot 自动配置之 TaskScheduler

摘要:Spring的TaskScheduler是一个轻量级调度器,适用于单机环境下的定时任务(如缓存清理、心跳检测等)。通过@EnableScheduling注解开启功能,并自动配置TaskScheduler实例。使用方式有两种:1)注入TaskScheduler实例手动调度任务;2)使用@Scheduled注解标记定时方法(需注意方法访问权限)。自动配置类TaskSchedulingAutoConfiguration会根据条件创建线程池调度器,实现简单可靠的任务调度功能。

2025-09-26 11:24:58 1191

原创 在 Spring 中使用 ThreadPoolTaskExecutor 手动构建线程池

摘要:本文介绍了使用Spring的ThreadPoolTaskExecutor配置线程池的最佳实践。推荐使用ThreadPoolTaskExecutor因其原生支持Spring、配置灵活、便于容器管理等优势。文章提供了两个典型配置示例:处理奖励积分的30线程固定池和处理支付后任务的2-5线程弹性池。同时指出了使用注意事项:避免滥用线程池、合理设置核心参数、处理异步异常等。建议小型项目使用SpringBoot默认线程池,中大型项目通过集中管理实现精细化控制。最佳实践是统一配置线程池参数并结合@Async使用。

2025-09-25 09:50:20 370

原创 使用 ScheduledExecutorService 执行延迟任务

摘要: 这是一个定时任务执行器类,用于调度延迟任务。采用单例模式,通过静态线程池实现任务调度,核心线程数为1,使用命名线程工厂。提供两种调度方法:默认延迟2分钟执行和自定义延迟时间执行。类初始化时注册JVM关闭钩子以确保线程池优雅关闭。该类封装了线程池创建、任务调度和资源清理功能,适用于需要延迟执行任务的场景。

2025-09-25 09:28:36 107

原创 COLA-statemachine事务失效踩坑

COLA-statemachine事务失效踩坑-阿里云开发者社区。

2025-09-24 10:57:42 192

原创 InnoDB 存储引擎的 RedoLog、UndoLog 在整个执行过程中的流程

MySQL事务执行流程:执行器开启事务后,InnoDB从磁盘获取记录页,先写UndoLog保存旧数据(支持回滚和MVCC),再写RedoLogBuffer记录新修改(WAL机制),最后更新BufferPool。事务提交时,RedoLog强制刷盘保证持久性,随后写入binlog。UndoLog用于事务回滚,RedoLog通过顺序IO解决BufferPool随机IO性能问题,确保宕机后可恢复数据。RedoLog刷盘时机包括:每秒定时刷、事务提交刷、缓冲区不足时刷。典型RedoLogBuffer大小为8MB。

2025-09-23 09:48:23 309

原创 docker logs 显示的日志,默认是保存在哪里?

Docker容器日志默认存储在宿主机的/var/lib/docker/containers/<容器ID>/<容器ID>-json.log文件中,对应docker logs命令读取的内容。Linux系统使用json-file驱动,日志会随容器删除而移除。长期运行可能导致日志文件过大,可通过修改/etc/docker/daemon.json配置日志轮转策略(如限制单个文件500MB,保留3个文件)来管理存储空间。

2025-09-22 11:11:34 419

原创 docker 容器终止时都做了什么?怎么优雅退出?

优雅退出 ≠ 等待没有流量优雅退出 = 收到 SIGTERM → 应用自己清理资源并退出如果应用没处理 SIGTERM,Docker 会在超时后用 SIGKILL 强制杀掉进程。

2025-09-18 11:16:33 387

原创 k8s 与 docker 的相同点和区别是什么?

Docker和Kubernetes都是容器技术领域的核心工具,二者都遵循OCI规范,旨在实现应用轻量化与可移植性。Docker专注于单个容器的构建、运行与分发,适合开发和小规模部署;而Kubernetes作为容器编排平台,管理大规模容器集群,提供调度、负载均衡等高级功能。两者并非竞争关系,而是上下游协作:Docker负责容器化,Kubernetes负责集群管理。

2025-09-17 15:34:42 397

原创 Docker compose 与 docker swarm 的区别

Docker Compose与Swarm核心区别 Docker Compose是单机容器编排工具,适合本地开发和测试,通过简单的YAML文件快速启动多容器应用。Docker Swarm则是原生的集群管理工具,支持多主机部署、负载均衡和服务发现,适合生产环境。Compose学习成本低但扩展性有限,Swarm复杂度高但支持集群调度。开发测试推荐Compose,生产部署建议Swarm或Kubernetes。两者可结合使用,用Compose文件在Swarm集群中部署应用。

2025-09-17 15:19:23 315

原创 MySQL InnoDB 为什么选择 B+ 树?

B+树是一种多叉平衡树,每个节点可存储大量键值(InnoDB中达1200+),显著降低树高度至3-4层。其特点包括:内部节点仅存键值和指针,叶子节点存实际数据并通过双向链表连接。这种设计使查询复杂度为O(logN),支持高效范围查询,且插入删除保持平衡。InnoDB采用高阶B+树以优化磁盘访问(亿级数据仅需3-4次I/O),特别适合数据库索引结构,实现稳定高效的查找性能。

2025-09-17 09:43:17 316

原创 spring boot autoconfigure 自动配置的类,和手工 @configuration + @bean 本质区别

Spring注册Bean的两种方式本质功能相同,但存在显著差异。手工配置(@Configuration+@Bean)显式声明、完全可控,适合业务核心逻辑;自动配置(@EnableAutoConfiguration)通过条件注解按需加载,提供开箱即用的通用组件配置。关键区别在于:手工配置直接加载,自动配置依赖条件触发;前者灵活度高但需全量编写,后者减少样板代码但需理解隐式规则。实际应用中,建议业务逻辑用手工配置,基础设施用自动配置,必要时可通过exclude或覆盖Bean进行调整。

2025-09-03 17:46:58 545

原创 Spring Boot + Nacos 配置中心示例工程

本文演示了如何使用Spring Boot集成Nacos Config实现动态配置管理。项目采用标准的Maven结构,包含启动类、控制器和配置类。通过bootstrap.yml配置Nacos服务器信息,使用@RefreshScope注解实现配置动态刷新。核心步骤包括:1)添加Nacos Config依赖;2)配置Nacos连接信息;3)创建带@RefreshScope的配置类;4)在Nacos控制台添加配置;5)通过/hello接口验证配置热更新效果。整个过程展示了如何无需重启应用即可获取最新配置值。

2025-09-03 17:38:32 721

原创 WebAppClassLoader(Tomcat)和 LaunchedURLClassLoader(Spring Boot)类加载器详解

Tomcat的WebAppClassLoader和Spring Boot的LaunchedURLClassLoader都保留了双亲委派机制的基本框架,但在特定场景下进行了调整。WebAppClassLoader会优先加载WEB-INF目录下的应用类,以实现应用隔离和热部署;LaunchedURLClassLoader则优先加载BOOT-INF目录下的类,以支持Spring Boot可执行JAR和内置依赖管理。两者都通过"子优先"的加载策略满足特定需求,同时保护核心类安全。这种设计既维护了

2025-09-03 14:41:43 389

原创 Spring MVC + JSP 项目的配置流程,适合传统 Java Web 项目开发

本文介绍了Spring MVC + JSP传统Java Web项目的完整配置流程。项目结构采用Maven标准目录,通过pom.xml配置Spring MVC和Servlet依赖。核心配置包括:在web.xml注册DispatcherServlet,配置dispatcher-servlet.xml实现组件扫描和JSP视图解析,编写控制器类映射请求路径,以及创建JSP视图页面。最后通过Tomcat部署war包即可运行。整个流程清晰展示了从项目搭建到部署的传统Java Web开发方案。

2025-09-02 15:28:07 386 1

原创 Spring Boot + Spring MVC 项目结构

本文介绍了一种在Spring Boot项目中同时支持JSP页面和JSON API的实现方案。项目采用混合架构,分别使用@Controller返回JSP视图和@RestController提供JSON数据。关键配置包括:添加tomcat-embed-jasper和jstl依赖支持JSP,设置视图解析路径,以及创建独立的控制器类处理不同请求类型。示例代码展示了页面控制器和API控制器的实现方式,以及简单的JSP页面示例。这种架构既保留了传统Web开发的页面渲染能力,又能提供现代化的RESTful API接口,适

2025-09-02 15:14:02 530

原创 Java 实现 MongoDB ObjectId 算法

本文介绍了Java实现的MongoDB ObjectId生成算法,严格遵循其12字节规范,包含时间戳(4字节)、机器标识(3字节)、进程ID(2字节)和计数器(3字节)四部分。实现采用MAC地址哈希生成机器标识,通过RuntimeMXBean获取进程ID,并使用原子计数器保证高并发下的唯一性。该算法每秒可生成1600多万个唯一ID,适用于分布式系统主键生成、日志追踪等需要时间排序的场景,性能优于UUIDv4。实现完整支持MongoDB标准的24位十六进制格式输出。

2025-08-27 13:58:34 458

原创 InnoDB读事务的ReadView机制深度解析

InnoDB的ReadView机制是其MVCC实现的核心,通过维护事务的一致性视图,实现了高效的并发控制。理解ReadView的工作原理对于深入掌握InnoDB的事务隔离机制至关重要,特别是在分析事务可见性和解决并发问题时。您之前对undo log保留机制和事务回滚的理解,正是ReadView能够正常工作的基础保障。

2025-08-26 16:46:08 434

原创 SpringBoot 内嵌 Tomcat 的常用配置

针对 application.properties 文件。

2025-07-23 20:22:45 439

原创 MyBatis 缓存配置

2025-07-15 17:34:43 232

原创 RAG 架构学习笔记

2025-07-09 16:04:01 415

原创 如何理解 MCP 大模型上下文协议 ?此协议对 AI 的重要性 ? 实践中有哪些普遍的应用?如何学习?

协议本质是将模型、数据源、工具通过标准化接口连接,解决“数据孤岛”问题。

2025-07-09 10:05:03 320

原创 MyBatis 每次数据库操作都会创建一个新的 SqlSession 吗?

MyBatis中SqlSession的创建机制因环境而异:原生MyBatis需手动管理会话生命周期,开发者需显式创建/关闭会话;与Spring整合时,通过SqlSessionTemplate实现每次数据库操作自动创建新会话并立即关闭,确保线程安全;事务场景下会话可复用,同一事务内共享会话。批量操作等特殊场景可手动控制会话类型。Spring整合方案(每次操作新建会话)是主流选择,而原生环境或显式事务中可实现会话复用。不同场景的会话管理策略需平衡线程安全与性能需求。

2025-07-03 09:52:55 1060 1

原创 Java泛型编译时擦除,为什么运行时还能通过反射能拿到?

‌阶段‌泛型信息状态反射支持性‌编译前‌完整泛型类型(源码)不适用‌编译后‌声明侧泛型存入Signature属性可获取 ‌‌运行时‌使用侧泛型被擦除不可获取 ‌📌 核心结论:‌反射获取的是编译时预设的泛型元数据‌(如类/字段/方法的泛型签名),而非运行时动态类型‌。这解释了为何二者能共存:编译器在擦除方法体泛型的同时,选择性保留了声明侧的元信息以满足部分反射需求。

2025-07-02 09:55:57 996

原创 Jenkins 与 GitLab CI/CD 的核心对比

Jenkins与GitLab CI/CD对比及中小企业选型建议 Jenkins和GitLab CI/CD在集成性、配置复杂度、权限管理等方面存在差异:Jenkins依赖插件扩展,灵活性高但配置复杂;GitLab CI/CD与代码仓库原生集成,YAML配置简单,适合快速上手。 中小企业选型建议: 优先GitLab CI/CD:适合资源有限、使用GitLab仓库或追求标准化交付的团队,开箱即用,运维成本低。 考虑Jenkins:适用于异构环境集成、遗留系统迁移或特殊技术栈需求,但需承担较高维护成本。 总结:多数

2025-07-01 09:47:12 805

原创 当前中小企业在 Docker 容器环境下部署 Java 项目的主流方案

中小企业主流采用Jenkins + Docker + Shell 脚本实现自动化发布,通过 Dockerfile 固化环境依赖,依托云服务器承载容器化应用。典型技术栈组合兼具效率与成本优势,是资源受限团队的务实选择。

2025-07-01 09:31:40 1467

原创 JDK 代理、‌Javassist、CGLIB 的性能对比及适用场景

Java动态代理技术主要有JDK代理、Javassist和CGLIB三种,它们在实现机制、性能和应用场景上存在差异。JDK代理基于接口和反射,仅支持接口代理,适用于轻量级AOP场景;Javassist通过字节码操作支持类和接口代理,适合灵活修改字节码但性能较低;CGLIB基于继承生成子类代理,适用于无接口的高性能场景,但无法代理final类或方法。选型建议:有接口优先JDK代理,无接口选CGLIB,需灵活修改字节码则用Javassist。Spring默认使用JDK代理,无接口时自动切换CGLIB。

2025-06-28 21:49:56 501

原创 Spring Bean 生命周期

Spring Bean生命周期详解:涵盖从定义加载到销毁的完整流程。关键阶段包括:1)Bean定义加载(可扩展BeanDefinitionRegistryPostProcessor);2)实例化(InstantiationAwareBeanPostProcessor);3)依赖注入;4)Aware接口回调;5)初始化(@PostConstruct/InitializingBean/init-method);6)使用阶段;7)销毁(@PreDestroy/DisposableBean/destroy-meth

2025-06-26 09:28:07 715

原创 Spring Boot应用容器化

生产环境务必配置资源限制与安全策略58,避免容器资源耗尽或被未授权访问。

2025-06-23 10:49:08 1022

原创 DDD 领域驱动设计之领域工厂

相似之处:两者都用于封装复杂性,确保系统的某些方面保持简单和一致。不同之处:领域工厂专注于对象创建,保证领域对象的一致性;防腐层专注于系统集成,保护领域模型免受外部系统变化的影响。通过理解这两者的职责和作用,设计人员可以更好地组织和维护复杂系统中的代码结构。

2025-06-18 17:05:42 391

原创 DDD 领域驱动设计之调用其他微服务

在领域驱动设计(DDD)中,微服务架构通常会涉及到与外部服务或其他微服务的交互。为了实现这种交互,你可以。这一层负责技术细节和外部系统的集成,使得领域层可以专注于业务逻辑而不被技术实现细节所干扰。关于客户端类的放置位置,通常在DDD的分层架构中,层是用来处理与外部系统的交互的。使用一个客户端类来封装调用逻辑。

2025-06-18 16:41:39 293

原创 DDD 领域驱动设计之 Service

在领域驱动设计(DDD)中,领域服务(Domain Service)是一个重要概念,用于处理那些不适合放在实体(Entity)或值对象(Value Object)中的业务逻辑。领域服务通常用于包含跨多个实体的业务逻辑,或者那些不属于任何特定实体的业务逻辑。下面是一个简单的领域服务示例,假设我们有一个电商系统,其中有订单(Order)和客户(Customer)两个聚合根。我们需要一个领域服务来处理订单的支付逻辑。

2025-06-18 16:35:13 386

COLA v5 component

COLA v5 component

2025-11-17

java-google-style

java-google-style

2025-10-13

java 开发手册,java 开发手册

java 开发手册,java 开发手册

2025-08-13

macos 下的 tree 命令的二进制文件

macos 下的 tree 命令的二进制文件

2025-06-13

空空如也

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

TA关注的人

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