- 博客(148)
- 收藏
- 关注
原创 Python 项目环境配置完全指南
] venv/ 已加入 .gitignore [ ] .env 已加入 .gitignore [ ] .env.example 已创建并提交(不含真实值) [ ] README.md 包含虚拟环境创建和激活步骤 [ ] requirements.txt 是最新的依赖列表 [ ] 没有敏感信息硬编码在源码中 [ ] 没有将 .pyc 或。.env.example:配置模板,方便协作者知道要填什么。误区 2:.env 和 .env.example 重复了,删掉一个 真相:两者作用完全不同,缺一不可。
2026-06-27 19:00:52
313
原创 Flink SQL 开发与优化指南
Flink SQL 是 Apache Flink 提供的流批统一的计算引擎,支持通过标准 SQL 语句进行数据处理。SQL 经过解析、优化后生成高效的物理执行计划,运行在 Flink 集群上。接口收益减少扫描 I/O减少无效字段读取静态分区裁剪动态分区裁剪减少扫描 I/O减少 I/O,输出数据量更小生成更优执行计划场景推荐配置/方案聚合类作业MiniBatch + 两阶段聚合 + Distinct 拆分多表 Join提前过滤 + 保留必要字段 + 表级 TTL维表关联。
2026-06-25 15:40:00
335
原创 Java深度分页性能优化:从问题本质到生产实践
游标分页是解决深度分页性能问题的黄金标准用位置替代偏移:通过最后一条数据的排序字段值定位,避免扫描无效数据联合唯一键:必须结合唯一ID处理排序字段重复的情况前后端协作:前端传递游标,后端解析并生成下一页游标索引是前提:复合索引是性能保障生产 checklist[ ] 表必须有唯一键(或联合主键)[ ] 建立复合索引,顺序与ORDER BY一致[ ] 排序字段值尽量不变(或接受数据跳跃)[ ] 游标Base64编码,防止篡改[ ] 限制最大页大小(建议≤100)[ ] 处理游标过期异常。
2026-04-03 15:46:19
354
原创 记一次生产级环境延迟故障排查:为什么浏览器访问慢,Postman却很快?
在多套并行开发的 Java 微服务环境中,测试环境 A(Test-1)突然出现严重的接口响应缓慢问题。对浏览器特征(Cookie/User-Agent)进行了拦截或慢扫描。首先怀疑是浏览器并发限制(HTTP/1.1 常见的 6 个连接限制)。第一阶段:排除前端与网络连接层(浏览器 VS 工具)浏览器加载页面会瞬间触发 20+ 并发请求。在 CPU 核心受限的环境中,并发请求导致的。第三阶段:压力测试下的“真相大白”才是 TTFB 过长的头号杀手。第四阶段:资源监控与链路回溯。怀疑测试环境 A 的。
2026-03-29 21:45:07
403
原创 xxlJob 报错 msg: job handler [updateDataArtsScripJob] not found
如果以上检查都没问题,建议重启执行器服务,并查看启动日志中是否有该 JobHandler 的注册信息。或者执行器服务部署在多台机器上,某台机器上没有该 JobHandler。配置与调度中心添加的执行器 AppName 一致。如果是旧版本(2.1.x 及以下),使用的是。查看执行器日志,确认是否成功注册到调度中心。如果是较新版本(2.2.0+),使用的是。调度中心配置了任务,但执行器服务没有启动。的类被 Spring 管理(加了。:注解中的名称要与调度中心配置的。检查执行器是否正确启动。
2026-03-10 10:37:30
321
原创 链表算法三道
题目核心技巧关键操作复杂度链表反转三指针next暂存、、双指针前移时间O(n) 空间O(1)两数相加II三次反转反转→相加→反转,将正序转逆序处理时间O(n) 空间O(n)合并K个链表分治归并递归分半、合并两个、逐层归并时间O(kn log k) 空间O(log k)反转用三指针,正序加法先反转,K个链表分治并。
2026-02-18 12:37:20
657
原创 LeetCode 2. 两数相加
本质:火车车厢模型数组(连续存储): [A][B][C][D] 像连排座位,必须坐在一起链表(离散存储): A → B → C → D 像火车车厢,每节独立,用钩子连接int val;// 当前车厢装的货物(数据)// 钩子,指向下一节车厢(地址)内存地址: 0x100 0x200 0x300 0x400l1指向这里逻辑上你看的是: 2 → 4 → 3特性数组链表内存布局连续分散随机访问O(1) 直接拿O(n) 必须从头走插入/删除O(n) 要搬动后面所有元素。
2026-02-18 12:34:18
917
原创 双指针专题
题目保留次数关键判断条件慢指针起始位置26. 删除重复项1 次nums[i]!= nums[j]027. 移除元素保留非 valnum!= val080. 删除重复项 II2 次2/*** 通用模板:在有序数组中保留最多 k 个相同元素* 适用于:26题(k=1), 80题(k=2) 等*/= x) {return idx;
2026-02-12 22:07:00
560
原创 为什么PostgreSQL的TIMESTAMPTZ无法映射到Java LocalDateTime?深度解析与解决方案
Override// 写入时:默认转为UTC@Override// 读取时:提取无时区部分return odt!= null?= null?= null?Mapper配置注意:此方案静默丢弃时区,仅在完全理解后果时使用。PostgreSQL类型推荐Java类型备用方案避免使用Instant❌TIMESTAMPDATELocalDateDate。
2026-01-14 15:55:32
1325
原创 华为云高斯数据库:gsqlexec用法
加载当前用户的环境变量,确保脚本可以访问必要的环境变量,如数据库连接信息等。:加载当前用户的环境变量,确保脚本可以访问必要的环境变量,如数据库连接信息等。每个批次的事务是独立的,因为每个批次都在自己的事务中完成操作。脚本按天粒度处理数据,确保每个批次的操作是独立的事务。对于每个日期,计算结束日期(当前日期的下一天)。打印当前处理的日期范围,方便跟踪进度。函数,处理当前日期范围内的数据。:从源表导出指定日期范围内的数据。中导出指定日期范围内的数据。,表示当前批次的起始日期。,表示当前批次的结束日期。
2026-01-07 16:41:02
489
原创 SQL性能优化:子查询优化
避免SELECT子句中的相关子查询:这是性能杀手预计算聚合结果:使用CTE或临时表减少重复计算合理使用索引:为JOIN条件和WHERE条件创建复合索引理解JOIN类型:明确区分LEFT JOIN和INNER JOIN的应用场景关注数据唯一性:一对多JOIN可能导致数据重复和计算错误应用层配合优化:结合缓存、分页、异步处理等方案SQL优化是一个系统性的工程,需要从数据库设计、查询编写、索引优化到应用层缓存全方位考虑。
2026-01-05 17:14:50
1068
原创 PostgreSQL 中序列(bigserial 和手动序列)的使用与注意事项
在 PostgreSQL 中,序列(bigserial和手动序列)是生成唯一标识符的重要工具。选择合适的序列方式取决于具体的业务需求,bigserial更适合简洁的自增主键场景,而手动创建序列则提供了更高的灵活性。在重置序列时,需要谨慎处理数据一致性和并发问题。在插入数据时,显式指定id值会导致序列不递增,这需要特别注意潜在的冲突风险。通过合理使用序列,可以有效提升数据库操作的效率和可靠性。希望本文能帮助你更好地理解和使用 PostgreSQL 的序列功能。如果你有任何问题或建议,欢迎在评论区留言讨论。
2026-01-04 16:34:35
1059
原创 PostgreSQL 中 nextval() 的线程安全性解析
nextval()函数通过原子操作、内部锁机制和非事务性设计,确保了在并发环境下的线程安全性。这些机制使得nextval()在高并发场景下也能稳定地生成唯一的序列值,无需担心线程安全问题。同时,通过查询序列的元数据,我们可以在不改变序列当前状态的情况下,预览序列的下一个值。在 Java 应用程序中,无论是使用 JDBC 还是 ORM 框架,都可以方便地利用nextval()来生成唯一的序列值,从而确保数据的唯一性和一致性。希望本文能帮助你更好地理解和使用 PostgreSQL 的nextval()
2026-01-04 16:20:20
1025
原创 【无标题】
反模式正确模式跨线程释放锁同线程获取/释放tryLock()无参依赖释放使用确保释放锁内执行耗时操作锁只保护临界区获取锁失败不清理资源失败时清理所有临时资源核心教训:分布式锁不是魔法,finally块也不是万能的。必须深入理解锁的实现机制,才能在异步场景下正确使用。
2025-12-26 16:34:26
1096
原创 Redisson分布式锁的线程绑定原则:为什么你的异步任务会抛出IllegalMonitorStateException
Redisson分布式锁的线程绑定原则是确保分布式锁安全性和正确性的重要机制。遵循"谁获取,谁释放"原则:确保锁的获取和释放在同一线程中避免主线程获取、异步线程释放的错误模式合理设置锁参数,包括等待时间和过期时间完善异常处理和资源清理,防止锁泄漏和资源泄漏使用工具类封装,提高代码复用性和可维护性通过正确理解和使用Redisson分布式锁,我们可以构建出既高效又安全的分布式系统。希望本文的分析和解决方案能够帮助你在实际开发中避免类似的陷阱。
2025-12-26 16:28:21
1012
原创 Spring AOP 常用注解完全指南
作用:定义可复用的切点表达式,避免在多个通知中重复编写。语法@Pointcut("execution(修饰符?返回类型 包名.类名.方法名(参数))")public void methodName() {} // 方法体为空,仅作为标识常用表达式:service 包下所有类的所有方法:controller 包下所有 public 方法:标注了 @Log 注解的方法:参数为 Serializable 的方法:service 包及其子包示例是否需要阻止方法执行?├─ 是 → @Around。
2025-12-25 15:44:11
822
原创 Spring AOP 高级陷阱:为什么 @Before 修改参数是“伪修改“?
开始↓是否需要控制目标方法执行?(阻止执行、修改参数、获取返回值)├─ 是 → 使用 @Around└─ 否 → 继续判断↓是否只需要在方法前执行?(权限校验、日志记录)├─ 是 → 使用 @Before└─ 否 → 继续判断↓是否只需要在方法后执行?(清理资源、记录结果)├─ 是 → 使用 @AfterReturning / @After└─ 否 → 考虑拆分切面职责@Before修改参数为什么"有时有效"?答案是——并非切面有效,而是 Java 引用机制在"捣乱"。
2025-12-25 15:32:51
927
原创 Redis防重复点击与分布式锁
当你想"限制用户在N秒内不能操作"时,用带过期时间的标记;当你想"确保只有一个线程能操作"时,才用分布式锁。防重复点击和分布式锁是两种完全不同的语义,但开发者常因"都用到Redis"而混用。防重复点击 = 冷却计时器:用SET NX EX,自动过期,无需释放分布式锁 = 互斥信号:用,手动释放,保护资源选错工具不仅代码复杂,还会引入死锁、性能下降、用户体验差等隐患。希望这篇文章能帮你避开这个90%开发者都踩过的坑。
2025-12-23 21:52:59
925
原创 Redis防重复点击与分布式锁实现方案对比笔记
维度防重复点击分布式锁核心语义冷却计时器互斥访问生命周期自动过期(无需手动)必须手动释放性能极高(单次操作)较高(需竞争)代码复杂度极低(3行)较高(try-finally)事务兼容性✅ 完美⚠️ 需分离锁与事务适用场景防重、限流资源竞争、排他操作。
2025-12-23 21:47:23
636
原创 “An I/O error occurred while sending to the backend” 时,可能是你的 SQL 参数超过了 32767
结果 DBA 说数据库一切正常,别的业务也稳如老狗。于是开始漫长的“甩锅”之旅……1 800 × 4 条 UNION × 3 天批次 ≈ 34 000 个参数,。34524 > 32767(0x7FFF),直接越界,驱动抛错。PostgreSQL JDBC 驱动在组装。MyBatis Foreach 陷阱 –。报文时,需要把参数个数写成 2 字节。JDBC 驱动只是忠实实现,。,参数个数瞬间降到 3 个。,提前留好分批/临时表口子。生产日志里突然冒出:复制。32767 是硬天花板,
2025-12-11 20:04:29
806
原创 Java 8 时间类型序列化翻车现场:从 LocalDateTime 不支持的异常到一劳永逸的 ObjectMapper 配置
Java 8 时间类型 → 必须注册从此LocalDateInstant都能被 Jackson 当成普通字段无缝转换,导出、缓存、RPC 全场景通用。
2025-12-09 17:07:09
394
原创 解决 Spring Security 在异步线程中用户信息丢失的问题
Spring Security 在异步线程中丢失用户信息是一个常见但容易解决的问题。简单项目:使用方案1(手动传递)即可中型项目:建议使用方案2(自定义线程池)大型项目:推荐使用方案3(Spring Security官方方案)或综合方案性能敏感:考虑方案4(避免在异步中使用安全上下文)无论选择哪种方案,都要记住:始终在finally块中清理安全上下文合理配置线程池参数添加适当的监控和日志进行充分的测试。
2025-12-09 17:04:50
918
原创 Java正则表达式性能优化指南:编译开销、类加载与线程安全深度解析
推荐做法静态常量预编译java使用Holder模式延迟加载javaPattern.compile("复杂正则");缓存动态生成的正则java。
2025-12-02 17:02:11
998
原创 一文吃透 Maven:生命周期、常用命令与实战场景全解析
无论你是刚转 Java 的新同学,还是在云原生里摸爬滚打的“老鸟”,Maven依旧是当下最主流的构建与依赖管理工具。我天天敲,但它到底干了啥?和 IDEA 绿色三角启动有什么区别?“集成测试、发版、排包冲突,分别该用哪条命令?今天这篇文章就把 Maven 的生命周期高频命令与真实场景一次性梳理清楚,让你不再“盲敲”,而是“心中有谱”。Maven├─ clean 生命周期│ └─ clean├─ default 生命周期├─ site 生命周期│ └─ site└─ 常用插件目标。
2025-12-01 23:46:30
887
原创 深度解析 Maven 配置架构:从 “No plugin found“ 错误看配置协同工作原理
Maven 的配置体系是一个精心设计的分布式配置管理系统。理解serversmirrorsprofiles和之间的协同工作原理,对于解决复杂的依赖管理问题至关重要。当遇到 "No plugin found" 这类问题时,我们应该从配置协同的角度系统分析,而不是孤立地看待单个配置项。这种系统性的思考方式,不仅适用于 Maven 配置调试,也适用于其他复杂系统的故障诊断。记住:好的配置设计应该是显式的、可调试的、符合约定的,这样才能在复杂项目中保持构建过程的可维护性和可靠性。
2025-11-27 20:43:49
982
原创 报表权限系统设计演进:从权限混乱到精细化管控
- 审计字段...致命缺陷:无法支持多个自定义报表,所有配置混在一起-- 问题:用户可能配置没有权限的字段-- 这里没有验证用户是否真的有权限查看这些字段COMMENT ON TABLE report_column_definition IS '字段定义表:统一管理所有可配置字段的元数据';COMMENT ON COLUMN report_column_definition.is_sensitive IS '是否为敏感字段,用于默认脱敏策略';-- 自定义报表主表。
2025-11-24 20:57:09
762
原创 Spring Boot 数据源健康检查技术文档
Spring Boot 提供了强大的健康检查功能,通过 Spring Boot Actuator 模块,可以轻松监控应用程序的运行状态,包括数据源的健康状态。本文将详细介绍 Spring Boot 数据源健康检查的实现原理、查看入口以及自定义健康检查的方法。创建一个自定义的@Component@Autowired@Override@Component@Autowired@Override。
2025-11-20 22:11:05
612
原创 Java 序列化与反序列化:深入解析与实践
通过定义一个自定义的序列化器,可以明确地告诉 Jackson 如何处理JSONNull类型。@Override// 将 JSONNull 序列化为 JSON 的 null然后,将这个自定义序列化器注册到 Jackson 的@Bean序列化和反序列化是 Java 开发中不可或缺的技术,它们使得数据能够在不同的存储和传输格式之间进行转换。通过合理选择序列化工具和格式,可以确保数据的高效传输和安全存储。在实际开发中,遇到序列化问题时,可以通过自定义序列化器或手动处理数据来解决问题。
2025-11-20 20:08:23
717
原创 华为云高斯数据库索引命中查询
从你提供的数据来看:所有索引的idx_scan都为 0,说明这些索引从未被使用过。这通常意味着:查询条件没有命中这些索引字段;或者优化器认为全表扫描更快;或者这些字段的过滤性太差,索引无效;或者这些索引是刚创建的,还没有查询使用它们。
2025-11-19 23:43:21
988
原创 LinkedHashMap 访问顺序模式
但在实际业务中,经常出现“只想拿到第一个插入的元素,却又不想破坏原有 LRU 顺序”的需求。本文给出三种零副作用(或低副作用)的解决方案,并附可直接落地的源码。适用场景:仅想知道“第一个 key/entry”是什么,而不需要 value。适用场景:必须根据 key 拿 value,但又不希望该节点被“访问后移”。都会把被访问节点移到双向链表末尾,以保证 LRU 语义。顺序的前提下,拿到 key="A" 的 value。适用场景:数据量不大、只读频繁、可接受额外内存。,链表就不会被修改。
2025-09-21 13:35:03
441
原创 PostgreSQL 索引使用分析2
1. EXPLAIN 验证索引 |v| 2. pg_stat_user_indexes 观察 || - 非实时 || - 非历史累计 |v| 3. 长期监控与优化 |索引优化不是一锤子买卖,而是一个持续观察-调整-验证的过程。理解统计信息的更新机制、正确使用 EXPLAIN、建立长期监控体系,才能让索引真正服务于业务性能。希望本文能帮你避开那些看似正确实则坑人的误区,真正做到“用数据说话”。
2025-09-03 15:07:25
505
原创 优化正则表达式性能:预编译与模式匹配的最佳实践
正则表达式是文本处理的强大工具,但在Java应用中不当使用会导致严重的性能问题。本文将深入分析正则表达式的性能优化策略,通过实际代码案例展示如何将正则表达式性能提升数倍。通过实施这些优化策略,我们可以将正则表达式相关操作的性能提升数倍甚至数十倍,显著提高应用程序的响应速度和吞吐量。正则表达式是强大的文本处理工具,但需要正确使用才能发挥最佳性能。这种写法在每次方法调用时都会重新编译正则表达式,对于高频调用的方法会造成巨大的性能开销。// 使用预编译的Pattern,性能大幅提升。
2025-09-01 18:07:38
1191
原创 优化括号匹配检查:从Stack到计数器的性能提升
在Java开发中,我们通常使用Stack数据结构来处理这类问题,但在特定场景下,使用简单的计数器可以获得显著的性能提升。通过本文的分析,我们可以根据实际需求做出明智的选择。在只处理一种括号类型且对性能有要求的场景下,使用计数器方案可以带来显著的性能提升,而不牺牲代码的可读性和维护性。传统的做法是使用Stack数据结构,但当我们只处理一种括号类型(如小括号)时,是否有更高效的解决方案?从测试结果可以看出,计数器方案在性能上有显著优势,比Stack方案快3-4倍,且内存占用和GC影响极小。
2025-09-01 18:04:07
516
原创 多维度指标交叉计算查询方案
业务方经常需要把“来源不同、口径不同、甚至维度列不完全一致”的 N 个指标拉到同一张结果表里做加减乘除。每多一个指标就再 JOIN 一次,JOIN 条件里还要层层 COALESCE,SQL 很快失控。比第一种稍好,但仍逃不掉 FULL JOIN 带来的复杂度 O(n²)。本文用一套“行转列”范式()彻底解决扩展性问题,并给出维度缺失、类型兼容、动态 SQL 等常见坑的填法。下文所有表名均已脱敏为tbl_xxxtbl_yyy,字段名保持原义便于阅读。
2025-08-25 20:30:08
991
原创 可扩展的三层级校验架构
解耦与复用校验逻辑与业务处理器解耦校验器可在不同场景复用灵活扩展新增校验规则不修改已有代码支持运行时动态调整校验链可观测性完整记录各阶段校验结果提供性能监控数据组合优于继承避免深度类层次结构支持更灵活的校验策略组合架构适应性可适配传统单体架构也适用于微服务架构这种接口化校验架构已在多个大型业务系统中验证,特别适合需要多维复杂校验的业务场景。通过将校验逻辑分解为独立的阶段,我们实现了关注点分离,提高了系统的可维护性和扩展性。
2025-08-16 16:11:11
1420
原创 draw.io编辑 UML 类图
文本型(写代码就出图) • PlantUML:在 VS Code / IntelliJ / Eclipse 里装 PlantUML 插件,新建 xxx.puml 文件,直接把你贴的那段粘进去就能实时预览、导出 PNG/SVG/PDF。纯图形(完全拖拽) • ProcessOn(国内在线)、Lucidchart、Gliffy 等:浏览器里拖框画线即可,不支持直接粘贴文本,但适合不会写 PlantUML 的同学。• Kroki、PlantUML Server:不想装插件,直接网页粘贴也可生成。
2025-08-16 13:31:01
1226
原创 MyBatis-Plus中JSON字段处理的常见问题与解决方案
当我们使用自定义Mapper方法时,MyBatis会严格按照XML中定义的SQL和映射规则执行操作,包括使用指定的typeHandler处理JSON字段。-- 其他字段映射... --></insert>通过以上配置,我们就可以正常使用MyBatis-Plus的内置方法来处理包含JSON字段的实体对象了。这个问题的核心在于MyBatis-Plus的自动SQL生成机制与自定义类型处理器之间的兼容性问题。
2025-08-08 00:07:36
805
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅