- 博客(1204)
- 收藏
- 关注
原创 阿昌教你看懂mybatisplus的sql语句的创建过程
前言前置版本:MybatisPlus3.0.5前些日子,阿昌写过一篇【mybatisplus的SqlSessionFacotry的创建过程】的菜鸡文章,这里我打算再记录一篇,关于mybatisplus的sql语句的创建过程。前戏同样,学过springboot的人都知道,如果要整合什么框架,肯定要去找XXXAutoConfiguration。在MybatisPlusAutoConfiguration中有如下,对SpringIoc容器进行注入sqlSessionFactory在这个方法中,他
2021-11-23 18:36:55
4794
7
原创 Agent从技术上看到底是什么
Agent 是一个能感知环境、自主决策、执行动作,并基于反馈循环迭代的程序。感知环境:能看到外部世界的状态,比如用户消息、文件内容、API 返回、网页信息。自主决策:能自己判断下一步做什么,不是每一步都等人指挥。执行动作:能真的对外部世界产生影响,比如写文件、调 API、发消息、改数据库。反馈循环:动作执行完,结果重新回到下一轮判断里。迭代:随着循环推进,越来越接近目标。如果没有这个循环,很多所谓的 Agent 其实只是chatbot。
2026-09-03 21:06:33
152
原创 SDD和Harness:AI编程的两大支柱
不要把 AI 当成“完全懂你的同事”,而要把它当成:能力很强,但缺少边界判断的执行者。第一,把需求想清楚,也就是 SDD。第二,把执行管起来,也就是 Harness。SDD 让 AI 不再靠猜。Harness 让 AI 不再乱跑。真正稳定的 AI 编程,不是多写 prompt,也不是盲目堆工具,而是把“想”和“做”都工程化。AI 编程越往后走,拼的不是谁更会喊 AI 写代码,而是谁更会定义目标、拆任务、设边界、做验证。
2026-09-01 20:36:59
231
1
原创 JDK排序异常-ComparisonMethodViolatesContract
JDK排序异常"Comparison method violates its general contract"常见于JDK 1.7+的TimSort算法,当Comparator违反自反性、传递性或对称性时触发。典型错误包括:相等元素比较返回非零值、long转int导致数值溢出等。修复方案推荐使用Date.compareTo()或Java8的Comparator.comparing方法,避免手动计算差值。尤其注意时间戳比较时,long强转int可能溢出导致排序逻辑错误。
2026-08-20 21:20:41
225
原创 RocketMQ 同一 JVM 启动多个 Producer 导致 NameServer 只连一个的问题
这个问题本质上不是 NameServer 配置没生效,而是:同一 JVM 下,多个 Producer 因为 ClientId 相同,底层共用了同一个。短期解法如果确实要一个 JVM 连多个 MQ 集群,就为不同 Producer/Consumer 设置不同的。长期解法如果只是集群迁移,直接统一所有到新地址,避免维护多套客户端资源。排查这类问题时,别只看业务代码里的,还要看到底层客户端实例是否被复用了。
2026-08-18 19:52:39
353
原创 缓存中的serialVersionUID序列化问题
实现 Serializable 接口的类,一定要显式声明,并且不要随意改动它。声明了就别改从上线第一天就定好,后续迭代不要动这个值。不要依赖 JVM 自动生成:自动生成的值受类结构影响,稍微改点东西就可能变,完全不可控。字段增删要谨慎:加字段一般没问题,旧数据那个字段会是默认值;但删字段或改字段类型,即使不报异常逻辑也可能出错。版本升级时注意数据兼容:如果缓存或数据库里存了序列化二进制数据,升级前要想好旧数据的兼容方案——要么保证 UID 不变,要么做数据迁移。
2026-08-11 20:22:02
231
原创 XXL-JOB 分片广播灵活控制执行节点数
方式适用场景复杂度原生 API 实现项目没有统一封装,或不想引入内部依赖每个 JobHandler 需重复编写ShardingJobHandler 封装引入 对应包 后即可使用业务代码极简通过任务参数指定 maxNode,结合分片广播的路由机制,跳过不需要执行的节点,同时修正 shardTotal 以保证分片查询正确。这个方案很轻量,不需要改 XXL-JOB 源码,也没有引入额外中间件,纯靠任务参数和分片序号判断就能实现。
2026-08-07 14:54:58
365
原创 千万规格商品搜索优化方案
针对电商系统千万级规格商品的搜索性能问题,本文提出了一种基于大宽表与PostgreSQL的优化方案。原系统存在多表联查、模糊搜索导致扫描行数爆炸等问题,通过将MySQL中的商品、SKU等表预关联为宽表,实时同步至PG并建立GIN三元组索引,将查询耗时从超时降至7秒内。相比直接迁移数据库或分店铺查询等方案,该方案通过写入时处理换取查询性能提升,实现了成本与效能的平衡,最终采用PG处理搜索请求+MySQL回查完整数据的架构,验证了数据模型优化比单纯更换数据库更关键的核心结论。
2026-08-06 20:44:28
357
原创 Dubbo服务重启时注册中心下线不及时问题排查与修复记录
本文记录了Dubbo 2.6.2服务重启时出现注册中心下线不及时的问题。主要原因是该版本仅依赖JVM shutdown钩子执行下线,而容器强制kill时钩子不触发,导致注册中心仍保留已销毁的服务节点。作者分析了Dubbo 2.6.3的改进方案(新增Spring事件监听机制),并给出两种解决方案:升级版本或自行实现监听器。最终采用方案二,通过监听Spring容器关闭事件主动触发下线,同时指出该方案未来升级时需注意API兼容性。问题本质是JVM钩子不可靠与容器销毁方式共同导致,建议长期方案还是升级Dubbo版本
2026-08-04 19:17:52
241
原创 接口幂等性方案详解
本文详细介绍了接口幂等性的概念、必要性及常见实现方案。幂等性指多次相同请求产生与单次请求相同的效果,在支付等关键场景尤为重要。常见的后端幂等方案包括悲观锁、乐观锁、唯一索引、去重表、分布式锁和Token机制,各有优缺点和适用场景。文章建议根据业务特点组合使用,如"分布式锁+唯一索引"的方案,既保证性能又确保数据安全。实现时需要权衡一致性、性能和复杂度,选择最适合业务需求的方案组合。
2026-07-30 19:12:15
201
原创 PonyTail:让AI写最少代码的工具
PonyTail是一款旨在减少代码量的AI工具,其核心理念是"最好的代码是你从未写过的代码"。它通过六步决策链(如优先使用标准库、避免不必要依赖)优化代码生成,在Java场景中表现尤为突出。例如,用JDK原生方法替代第三方库(如HttpClient替代OkHttp),可减少80-94%代码量并提升3-6倍执行速度。工具提供三种模式:Lite(建议优化)、Full(严格精简)和Ultra(极致简约),适合不同开发阶段。关键优势在于平衡简洁性与安全性,所有优化均通过注释标注,避免潜在风险。
2026-07-27 16:20:23
192
原创 RocketMQ LiteTopic:面向 AI 长任务的轻量消息
摘要 RocketMQ LiteTopic是专为AI长任务设计的轻量级消息通信模型,采用两级Topic结构(父Topic+LiteTopic)解决传统微服务在AI场景下的痛点。其核心特点包括: 会话即Topic:每个会话/任务对应独立LiteTopic,实现状态持久化和断点续传 异步解耦:突破HTTP同步调用的限制,支持分钟级任务执行和多Agent协作 智能消费:通过Event-Driven Pull和选择性消费优化大量订阅场景 自动管理:按需创建LiteTopic,基于TTL自动清理,降低运维成本 精细控
2026-07-23 21:15:28
209
原创 RocketMq事务消息原理
RocketMQ事务消息的核心原理是:Producer先将消息作为半消息发送到Broker特殊队列(消费者不可见),然后执行本地事务,根据结果通知Broker提交或回滚。若Producer未响应,Broker会定时回查,超过最大次数后放弃检查,确保消息不会自动提交。整个过程通过半消息机制和回查机制,保证本地事务与消息发送的最终一致性,避免数据不一致问题。关键点包括:半消息隔离、事务状态主动通知、Broker定时回查兜底,是一种非强一致的分布式事务解决方案。
2026-06-16 21:53:34
263
原创 Java优质开源AI项目
这个笔记想表达的很简单:Java 开发者现在已经可以比较顺畅地参与 AI 应用开发了。以前 AI 生态主要在 Python,但现在 Java 这边也有了不少成熟选择。Spring AI:最适合 Spring Boot 项目做 AI 能力接入:适合企业级 Agent 和工作流编排:适合快速验证和灵活集成AgentScope:适合多智能体系统Solon-AIAgent-Flex:适合轻量或兼容性场景Smile:适合传统机器学习方向如果本身是 Java 后端,不需要一上来就去研究模型训练。
2026-06-04 10:45:47
389
原创 大模型常见参数学习笔记
核心就是:大模型不是魔法,它是在有限上下文窗口里,根据概率一个 Token 一个 Token 生成结果。所以做 AI 应用开发时,要重点关注三件事。第一,Token是成本和容量单位。输入、输出、历史消息、RAG 内容都会消耗 Token,所以不能只按字数或者段落数来估算成本。第二,上下文窗口是有限资源。上下文越大不代表越可以乱塞内容,真正上线时还是要做 Token 预算、历史裁剪、RAG 片段去重和输出长度控制。第三,采样参数决定输出风格和稳定性。控制随机程度,Top-p和Top-k。
2026-06-02 23:18:18
338
原创 LangChain4j-AiServices实现原理解析
本文分析了LangChain4j中AiServices的实现原理。通过动态代理技术,AiServices在运行时为接口生成代理对象,无需手动编写实现类。当调用接口方法时,代理逻辑会将参数转换为UserMessage,组装ChatRequest并调用底层模型,最后将模型返回的AiMessage转换为接口声明的返回类型(如String)。整个过程实现了从接口定义到模型调用的无缝衔接,支持模板变量等高级功能,同时隐藏了底层HTTP请求等复杂细节。这种设计让开发者只需关注接口定义,就能便捷地与大模型交互。
2026-05-27 20:00:20
437
原创 用一个数字存储海量 Tag 标签
本文介绍了一种利用二进制位存储海量标签的高效方案。通过将每个标签对应一个二进制位,多个标签可以合并为一个数字存储在数据库中。这种方法适用于标签数量多但每个标签仅为开关状态的场景,如商品系统、用户画像等。文章详细阐述了位掩码的核心原理、代码实现方式、数据库查询技巧,并分析了方案的优缺点。该设计具有节省空间、扩展成本低、判断效率高等优势,但也存在标签数量限制(约62个/字段)。当标签过多时,建议按业务语义拆分为多个字段存储。这种方案特别适合需要频繁新增标签且避免频繁修改表结构的业务场景。
2026-05-25 17:18:08
409
原创 如果线程池中线程异常后:销毁还是复用?
本文探讨了Java线程池中线程异常后的处理机制。通过测试代码发现:使用execute()提交任务时,若线程抛出未捕获异常,线程会被移除并创建新线程;而使用submit()提交任务时,异常会被封装在Future中,需调用get()方法才能捕获,线程不会被移除。源码分析表明,execute()通过processWorkerExit()处理异常线程,而submit()通过FutureTask内部状态管理异常。两种方式均不影响线程池其他线程的正常执行。
2026-05-23 13:28:49
387
原创 并发线程工具类分享
本文分享了一个Java并发线程工具类ConcurrentExecutor,主要特点包括:支持信号量控制并发数、自定义线程池和简单易用。该工具类通过信号量机制限制并发线程数量,并提供阻塞等待所有线程执行完成的功能。使用示例展示了如何通过该工具类实现多线程调用AI模型,包括提交任务、阻塞等待和获取执行结果等操作。核心方法包括submit()提交任务、invokeAll()阻塞等待和getSyncExecuteResult()获取结果,适用于需要控制并发数的多线程场景。
2026-05-20 21:03:33
57
原创 macOS 26 Chrome 浏览器后台 Google Chrome Helper (Renderer)占用内存超高解决办法。
摘要:macOS用户阿昌分享了Chrome浏览器内存占用过高的解决方法。当发现Google Chrome Helper (Renderer)进程CPU占用近400%时,通过浏览器任务管理器定位到是ubi商城网页导致。关闭该标签页后系统恢复正常。该问题表现为特定网页引起Chrome进程异常占用资源,简单的页面关闭即可解决。建议用户遇到类似问题时检查浏览器任务管理器排查问题页面。(97字)
2025-11-14 17:23:43
1494
原创 Tika工具包-搞定上千种文件解析
hi,我是阿昌,今天分享学习的是;它可从一千多种不同文件类型(例如ppt、xls、pdf、xmind、cad等)中提取解析出元数据和文本。如果你有对如上文件类型进行提取分析的需求,不凡试试这个框架。那这里本次使用java语言进行演示demo。
2025-10-04 23:12:58
1029
原创 mac安装mvnd结合idea
只需要在末尾打开jdk和maven配置项目两个注释,写入自己的jdk环境变量位置和maven的配置文件位置就ok;,今天记录一下mac系统下如何安装mvnd同时通过maven-helper插件配置mvnd命令,提升编译速度。这里结合idea里的插件maven-helper,中配置mvnd指令的地址即可。不要使用原生的mvn指令。
2025-06-13 17:57:22
1555
原创 spring-ai入门
这里的ChatModel 会使用SpringBoot自动装配,打断点就可以得知为通义千问的实现,同样的如果在路径和依赖里面注入诸如“千帆”“豆包”的maven依赖并进行正确的配置,则也能转为对应大模型的实现,所以SpringAI实际上也提供了一种接入规范,不然每家大模型都搞一个接入规则,对接多个大模型的复杂度就会成倍上升。为什么要用向量数据库呢?SpringA,当时理解的比较肤浅以为这个东西就是简化下对接大模型的复杂度,制定统一的接入规范,但是没想到过几个月一看,目前的SpringAI 已经有了完全对标。
2025-06-04 13:47:17
1252
原创 并发提速方案
最后,通过 CompletionService 接口提供的 take() 方法获取一个 Future 对象(之前提到过,加入到阻塞队列中的是任务执行结果的 Future 对象),调用 Future 对象的 get() 方法就能返回询价操作的执行结果了。除此之外,CompletionService 能够让异步任务的执行结果有序化,先执行完的先进入阻塞队列,利用这个特性,可以轻松实现后续处理的有序性,避免无谓的等待,同时还可以快速实现诸如 Forking Cluster 这样的需求。
2025-03-06 17:18:19
1121
原创 jdk源码分析-java.lang.Boolean
针对java开发人员,这是一个十分十分十分十分常用的类,所有的项目中都会使用到这个类,我这里学习的代码是针对jdk1.8中的`java.lang.Boolean
2024-11-12 17:56:36
844
1
原创 Caffeine本地缓存框架
缓存(Cache),在软件无处不在。从底层CPU多级缓存,再到客户页面缓存,和服务器数据缓存,导出都存在着缓存的身影;从本质上讲,缓存是一种空间换时间的手段,一种计算完后,使下次进行访问数据,不再重复处理,节省时间整体的处理时间;针对Java而言,对应的常用缓存解决方案有很多,例如数据库缓存框架EhCache,分布式缓存Memcached/redis等,这些缓存方案实际上都是为了提升服务吞吐效率,避免持久层压力过大。对于常见缓存类型而言,可以分为本地缓存以及分布式缓存两种,Caffeine。
2024-10-27 14:33:34
1824
原创 【阿昌之丑陋代码优化】重复代码优化方案
在开发的过程中,不同的人有不同的编码方式和技术阶段,经过日积月累的流逝,就会出现传闻中的“屎山”代码。那阿昌“屎山“中有重复代码的问题,那今天就提供几种重复代码的优化思路,具体问题还要看具体场景。在开发的过程中,不同的人有不同的编码方式和技术阶段,经过日积月累的流逝,就会出现传闻中的“屎山”代码。那阿昌“屎山“中有重复代码的问题,那今天就提供几种重复代码的优化思路,具体问题还要看具体场景。
2024-08-15 17:57:20
1202
原创 谁再用Arrays.asList就开除谁
针对对应的坑,所以不推荐使用,来直接从根源上避免出现坑。不然就想要注意在使用中的场景是否符合你的要求,如不对创建的List进行增删改的操作。等等。
2024-02-13 16:49:32
1024
原创 LiteFlow规则引擎框架
那首先得知道什么是规则引擎?规则引擎是 一种用于自动化处理业务规则的软件组件。在软件行业中,规则引擎通常用于解决复杂的业务逻辑处理问题。它可以将业务规则从应用程序中分离出来,并以一种易于管理和维护的方式进行配置和修改。规则引擎能够根据预先定义的规则集对输入数据进行评估和处理,并根据规则的结果执行相应的操作。这样可以提高软件系统的灵活性、可扩展性和可维护性。规则引擎在许多软件领域都有广泛的应用,比如金融行业的风险评估、保险业的理赔处理、电子商务的促销活动等。
2024-02-09 17:41:48
2011
原创 Mybatis中的sql-xml延迟加载机制
主查询对象关联对象假设咱们现在有2张表,一张是item表,一张是sku表,对应关系是1对多的关系主查询对象:itemDO关联对象:itemDO对象中的skuIdList。
2024-02-05 13:45:08
1242
原创 Http请求Cookie失效问题
在cookies的使用中,要符合对应的使用规范,避免开发中出现问题;业务解决方案:将替换为最后不再报错,符合业务。
2024-02-02 18:04:42
1400
原创 dubbo项目发布时Destroyed异常分析
源码可知,消费者调用dubbo时,调用invoke(),其会判断当前消费者的标记位是否被销毁状态,如果是就抛出以上异常,否则继续执行调用逻辑。相关的报错日志,来提示dubbo消费者调用生产者时,生产者服务已经DESTROYED。结合发布场景每次服务发布的时候才产生异常,所以先考虑2/3的情况;溯源找到对应的业务代码,发现时。在发布项目时,elk有打印。定时任务的调用业务,
2024-01-18 10:50:00
1572
原创 电商概念之商品模型
广义定义:商品是为了出售而生产的劳动成果,人类社会生产力发展到一定历史阶段的产物,用于交换的劳动产品。商品类目商品属性销售属性商品编码&商品规格编码SKU和SPU。
2024-01-15 17:19:05
3712
原创 阿昌教你如何优雅的数据脱敏
Target(ElementType.FIELD) //作用于字段上@JacksonAnnotationsInside // 表示自定义自己的注解Sensitive@JsonSerialize(using = SensitiveInfoSerializer.class) // 该注解使用序列化的方式/*** 方法来源于ContextualSerializer,获取属性上的注解属性,同时返回一个合适的序列化器*/@Override// 获取自定义注解。
2023-11-01 16:59:32
895
原创 基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理
com.alibaba.csp.sentinel.slots.block.flow.FlowSlot#checkFlow中会有com.alibaba.csp.sentinel.slots.block.flow.FlowRuleChecker来根据对应的FlowRule规则来判断是否通过或者执行对于的降级逻辑等;这里涉及到Sentinel中的Slot责任链,依然用的com.alibaba.csp.sentinel.slots.block.flow.FlowSlot举例。
2023-10-25 17:34:31
1018
原创 Day982.各大开放平台是如何使用OAuth 2.0 -OAuth 2.0
开放平台体系的整体结构和授权流程,以及第三方软件开发者关心的对接开放平台的通信流程中需要传递的参数。以下三点内容。当有多个受保护资源服务的时候,基本的鉴权工作,包括访问令牌的验证、第三方软件应用信息的验证都应该抽出一个 API 网关层,并把这些基本的工作放到这个 API 网关层。各大开放平台都是推荐使用授权码许可流程,无论是网页版的 Web 应用程序,还是移动应用程序。
2023-10-24 22:42:00
744
原创 23.10.13数据库升级流程记录
涉及到数据库升级,只能部分分库用户使用,或者全库停机,当前场景为。将之前的数据库升级为8.0版本,切只涉及一个分库;因为是全库停机发布,所以选择低流量时间点凌晨3点🕙。
2023-10-13 10:10:32
659
原创 23.09.26用户切库流程记录
因为db_A用户数据量超过预期,磁盘空间逐渐不足,需要换成db_A库的压力,所以将部分db_A用户切至db_B中。先整理出想要切库到db_B和保留在db_A的用户名单;将A库的用户,切到B库中,db分片为单独存储到话,如。db_A删除切出用户,db_B删除未迁移的用户;先将db_A中的数据全量复制到db_B中;对应到值,以确保切库后表路由的。,则切后用户需要更新分片信息。
2023-09-28 10:20:18
635
原创 Day981.OAuth 2.0的工作流程与安全问题 -OAuth 2.0
OAuth 2.0 是一个授权协议,它通过访问令牌来表示这种授权。第三软件拿到访问令牌之后,就可以使用访问令牌来代表用户去访问用户的数据了。所以,我们说授权的核心就是获取访问令牌和使用访问令牌。OAuth 2.0 是一个安全协议,但是如果使用不当,它并不能保证一定是安全的。如果不按照 OAuth 2.0 规范中的建议来实施,就会有安全风险。比如,没有遵循授权服务中的授权码只能使用一次、第三方软件的重定向 URL 要精确匹配等建议。安全防护的过程一直都是“魔高一尺道高一丈”,相互攀升的过程。
2023-09-16 16:52:35
680
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅