Lombok 拾遗
Created|Updated|Java
|Word Count:43|Reading Time:1mins|Post Views:
sneakyThrow
1 | |
Author: magicliang
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles
2026-10-04
Java常用类库-E08-MapStruct与Lombok的生成代码契约
删除手写代码之前先保留行为契约 商品输入对象需要转换成展示对象,还需要支持更新已有对象。MapStruct 可以生成字段映射,Lombok 可以生成访问器、builder 和相等方法。代码行数减少之后,null、集合引用和 hashCode 行为仍然存在;如果不检查生成结果,就可能把原本看得见的决策变成构建过程中隐含的默认值。 本篇使用独立 Maven 模块,实际运行 MapStruct 1.6.3 与 Lombok 1.18.42,并显式加入 lombok-mapstruct-binding 0.2.0。固定源码分别为 b4e25e49deae707b50ce061172e114292b414a23 与 2031eb0880942b5f0b7281580f6e877a3e87279a。所有应用源码保持 Java 8,在 JDK 8 和 JDK 21 分别 clean verify,没有用已经生成的 class 代替处理器执行。 完整项目见 下载处理器实验工程,测试见 ProcessorContractTest.java,生成映射见 ProductMapperImpl.java,...
2026-10-04
深入 Hibernate 00:从对象操作到数据库结果,证据链怎样建立
实验材料状态:下文保留先前 PostgreSQL 16.15 的原始记录。当前检出版本在专用 PostgreSQL 16.15 上复跑 00–03,6 项测试通过;新运行的报告在 examples/hibernate-lab/evidence/00-03/20261003T030855Z-pg16-cumulative/。2026-10-02 的 PostgreSQL 17.6 基线位于 examples/hibernate-lab/evidence/local-baseline/20261002-pg17/;同步后复跑 00–12,50 项通过,见 examples/hibernate-lab/evidence/00-12/20261003-pg17-synced-local/。系列主模块最终累计 136 项通过,见 examples/hibernate-lab/evidence/cumulative/20261003-pg17-final/。各环境与各轮运行分别留证。 问题是哪个观察者看到了订单 创建订单的代码执行到 persist(order),此时订单对象可能已经有 ...

2019-09-02
Java 服务 OOM 排查全链路(Linux 内核 + JVM 工具链 + 问题分析)
Java 进程的 OOM 跨两层:Linux 内核的 OOM Killer 在物理内存或 cgroup limit 触及时 kill 进程,事后只能从 dmesg 还原;JVM 的 OutOfMemoryError 在堆/元空间/直接内存耗尽时抛异常,常带堆栈和 dump。两层工具栈不同:Linux 侧看 dmesg、cgroup、内核参数,JVM 侧看 jstat、jmap、jstack、arthas、JFR、gperftools。 一、Linux 层:OOM Killer 机制 Linux 内核有个 OOM (Out of Memory) Killer 的机制,可以在系统内存不足的时候,通过主动杀死一些进程来释放更多的内存空间。 很多时候,可以 ping 通一台服务器,但无法 ssh 上去,因为 sshd 被 OOM Killer 杀掉了。ping 能 ping 通,是因为处在内核态协议栈还能工作,发出回送报文。sshd 则因为是用户态进程,直接被干掉了。 OOM Killer 工作流程 OOM Killer 的完整工作流程如下: 关键机制 oom_score 每个进程都有...

2026-10-10
Go E01:Java 经验迁移时容易误读的三个 Go 契约
主线 39已经核验服务的接纳、查询和退出;系列导航仍把 E01–E08 单独计数。迁移 Java 经验时,几个用词看起来熟悉:null、对象引用、线程中断。但 Go 的接口值、struct 值与 context 取消有自己的规则。本篇只在原累计工程上加三项反例测试,不复制 Java 服务。素材另附SHA-256及复跑步骤。 不能用 Java 的 null 猜接口是否为空 Go 1.27.1 的语言规范在 Variables 一节直接给出 var v *T 为 nil、x = v 后接口 x 动态类型为 *T 的例子。TestElectiveJavaTypedNilIsNotMissingTask 把 nil 的 *electiveLookupError 赋给 error:原指针仍为 nil,接口比较 err != nil 却为 true。这是typed nil,不是「有一个非空错误对象」。测试给错误方法加了 nil 接收者保护,以便观察接口内容,而不是靠 panic 判断。 同一任务服务的真实 TaskStore.Lookup("missing") 返回 (T...

2026-09-06
从零构建现代搜索引擎(01):建立可重复运行的项目
Git clone 拉下来的项目跑不起来,原因通常不是代码有 bug,而是环境不对:JDK 版本不匹配、Maven 插件解析失败、依赖拉不到。调试这类问题消耗的时间往往比写业务代码还多。这个系列从搜索引擎的第一行代码开始,但在写第一行代码之前,要先回答一个更基本的问题:怎样保证任何人在一个干净目录里执行一条命令就能构建运行。 本篇的交付物是一个可构建的 Maven 项目,包含几份 fixture 文档和一个顺序扫描式搜索 CLI。输入一个关键词,程序遍历所有 fixture 文件,打印包含该关键词的文档标题和匹配行。功能极简,但四个验证场景——正常查询、空查询、不存在的路径、--help——必须全部通过。 锁定工具链版本 "用最新版"不是版本策略。版本策略是把每个组件钉到一个具体的数字上,并说明为什么选它。 组件 版本 选择理由 JDK Eclipse Temurin 25 (LTS) 2025 年 9 月发布的长期支持版;GPLv2 + Classpath Exception 许可证,无商业歧义 Maven 3.9.16 3.9.x 系列...
2026-10-04
深入 Play E07:虚拟线程与阻塞 IO,等待发生在哪里
两个数据库连接、四个准入名额、每条 SQL 休眠 50 ms。平台线程和虚拟线程在高并发的三轮实验中都接受了四个请求、拒绝了二十个请求。平台模式主要在执行器队列等待,虚拟模式主要在连接池等待;两者成功响应的 p95 都在约 110 ms 附近。 去掉准入后,同一个虚拟线程执行器同时启动 48 个任务。数据库仍只有两个活跃连接,另外 46 个任务等待借连接,最长借用耗时达到 1282 ms。线程创建成本降低之后,下游容量与等待队列仍需要独立限制。 固定版本与实验边界 独立工程位于 play-electives/e07-virtual-threads,没有替换累计工程的 dispatcher,也没有改变 Play 的 HTTP 服务端。控制器将 JDBC 工作交给一个平台线程执行器或一个虚拟线程执行器,并向 Play 返回 CompletionStage<Result>。这个结构延续了第 13 篇的线程隔离、第 22 篇的连接池以及第 31 篇的容量观测。 固定版本为 Play 3.0.6、Scala 2.13.15、sbt 1.10.7、Amazon Corretto...
Contents
