从真实负载和故障证据出发,完成批量访问、幂等、事务、重试与外部副作用优化,同时落实编码与XML SQL规范。
## 任务目标 请在当前目标工程中,完成本次范围内的 Java 性能、幂等与可靠性优化。必须先查证瓶颈,再完成代码修改和验证;不能只提出缓存、异步或加线程的建议。资料可从工程获得时自行读取,仅对影响正确性的关键缺口提问,继续完成其余已授权工作。 在现有授权范围内完成实际改动和验证;缺少外部条件时先完成可独立实现的部分,不能只停留在计划。 ## 输入信息(选填) 两项均可留空,也可直接用一句话说明目标并附上已有资料。无需自行整理版本、配置或完整需求表;能读取的内容由执行者补齐。 优化链路:优先选择当前对话指出的慢接口或重复执行问题;未指定时从当前 Java 工程的已有慢调用证据、循环访问和写操作中识别一条可定位、可验证的链路,说明选择依据后先完成该链路。 工程与性能资料:读取当前仓库的模块依赖、入口、SQL、事务、重试、已有测试和可用性能记录,自动确认版本、格式规则与验证命令,不要求用户重新填写这些信息。 ## 信息不完整时 先使用本次对话中已经说明的信息;用户留空、写“暂无/不清楚”或未替换输入标记,都按缺失处理,不当作真实路径、参数或业务值。已能从资料确定的内容不重复询问,不编造文件、日志、接口、业务值或执行结果。在用户已授权的范围内读取相关工程和材料,不为补齐输入擅自扩大操作范围。 ### 优先确认 - 沿入口追踪 SQL 与远程调用次数、循环取数、事务和锁范围,以及下游连接与线程资源。 - 读取业务幂等键、唯一约束、处理中记录、重试接管和结果查询实现,核对权限与租户范围。 - 检查实际 Maven 或 Gradle、MyBatis XML、数据库迁移、静态检查和格式配置。 - 查找代表性测试数据、已有压测结果、延迟与资源指标;没有实测时识别能够本地复现的访问模式。 ### 可采用的默认处理 - 沿用现有版本、接口契约与中间件;先修正有代码或测试证据的重复工作,不默认加缓存、异步或线程。 - 缺负载数据时先记录调用次数、批量边界和可测指标,性能收益保留待测,不编造吞吐或最优参数。 - 保留稳定数据库编码与旧数据语义,XML SQL 和局部格式规则按原约束实施,限制本轮改动范围。 ### 必须有依据的事项 - 同一业务意图的判定、同键异参处理或处理中接管规则没有可信依据时,不自行改变幂等业务结果。 - 批量改造会改变事务原子性、顺序、权限或外部副作用,而其业务容忍度无法确定时,暂停该项语义变更。 只有缺口会改变业务结果、权限边界或关键实现,且无法从现有资料确认时,才集中提出最多 3 个关键问题;说明影响,并继续完成不依赖答案的部分。一般命名、排版和可逆实现细节按现有约定决定,不逐项等待确认。 ### 资料仍不足时的交付 - 无工程时交付循环批量化与幂等状态的可执行示例、测量清单和故障用例,标明示例假设及尚未实施到项目。 - 缺运行环境时完成可执行的编译、静态检查和隔离回归,给出按同一数据与负载比较前后的测量步骤。 ## 执行要求 以实际运行版本和部署约束为准,不默认升级框架或引入中间件。SQL全部放XML、编码与字典分工等是本项目硬约束;MyBatis支持SQL注解,本项目明确禁用。 1. 只读确定范围和基线。确认仓库分支、未提交改动、真实入口及调用链,记录权限租户、返回字段、顺序分页、事务原子性和错误语义。保护无关改动,先运行已有相关检查,区分原有故障。用代表性数据和请求记录SQL/远程调用次数、延迟分位、吞吐、错误、连接等待、CPU与内存,写明并发、样本、冷热状态和时间窗口。缺少监控只能标记假设,不能虚构瓶颈或收益。 2. 按证据选择最小改动。区分数据库扫描、N+1、远程等待、锁竞争、重复计算和大对象分配,列出根因证据、候选方案、代价和可回退点。优先修正错误访问模式与重复工作,不为局部变快改变业务结果或降低权限校验,不一次叠加多个难以归因的优化。涉及架构或接口变化时明确新旧兼容,先完成范围内可验证的修改。 3. 优化for中的数据访问。定位循环查库、远程调用、懒加载和对象转换暗含的请求,按租户及业务键去重批量取数,再使用有界映射组装;没有批量接口时评估有界并发及下游限制,不能改成无界并行。控制单批参数量、页大小、事务时长和内存,避免巨大IN与全表加载。保留重复项、顺序、缺失关联和错误语义;联表注意行数膨胀与分页计数,跨页修改要考虑稳定游标与并发变化。for清晰就保留,不一律改Stream或parallelStream。 4. SQL统一落在XML Mapper。MyBatis的全部SQL从Java业务层、SQL注解、Provider、字符串或SQL Builder/Wrapper中迁入XML,Mapper接口只留契约和必要参数绑定;核对namespace、参数、resultMap、主键回填和加载。值使用#{参数}绑定,动态列、表和排序方向须服务端白名单并由XML选择固定片段,禁止将用户值送入美元符文本替换。空集合、全空更新和条件缺失不能变成全表操作。依据真实执行计划和数据分布调整查询及索引,不能仅以语法或扫描告警判断性能。 5. 将幂等设计落实到持久化。明确“同一次业务意图”的业务键、租户与操作范围、参数摘要和保留期,用数据库唯一约束或等效原子条件及事务争用执行资格,先查后插只能辅助。区分首次执行、处理中、成功、确定失败和结果不明;同键同内容按契约返回既有结果,同键不同内容拒绝冲突。并发唯一冲突须查询归属正确的记录,先核对当前事务是否仍可用,不吞异常后假成功;缓存锁和前端防抖都不能替代业务唯一性。 6. 处理超时、重试及接管。客户端超时不证明服务端未提交,优先用业务键查询最终状态,未经确认不得换新键重做。按失败类型定义可重试项、次数、退避和总时限;死锁等重试要重建正确事务边界,状态不明先对账。处理中记录须有合法接管条件,避免超时后旧执行者仍能写入;必要时用版本或执行令牌拒绝过期持有者。跨租户查询及结果回放都要重新验证权限。 7. 验证事务和外部副作用。核对代理方式、传播、事务管理器、锁范围及回滚规则;默认代理模式下自调用不会触发被调方法的事务语义,但可能仍处于外层事务。受检异常是否回滚按配置验证,不让catch吞掉失败。数据库事务不覆盖远程扣款、发信或消息投递;按已有能力使用下游业务幂等键、结果查询、可靠事件或补偿,并覆盖本地提交与外部成功不同步的窗口。afterCommit回调不等于可靠投递,不能承诺跨系统天然恰好一次。 8. 控制资源和失败放大。避免持数据库锁等待慢远程响应;减少事务范围前先保持业务原子性,不能随意拆批提交。线程池、队列、连接池、超时和并发上限按负载及下游容量设界,正确传播并清理租户和追踪上下文,处理中断与取消。缓存必须说明权限维度、更新失效与一致性要求,不能把数据库故障降级成成功空结果;优化不能把压力转嫁给下游而掩盖本地指标。 9. 同步完成编码与结构标准化。消除状态、类型、阈值和业务字符串魔法值;稳定有限的数据库编码用显式code的enum,核对序列化和TypeHandler,禁止ordinal持久化及随名称变化改库值。可配置字典数据库为唯一来源,不手工重复维护enum加字典;常量和配置各按语义归属。保留旧值、停用值和未知编码,读取可标未知但不篡改原值,写入或状态迁移需受控校验。Controller管协议入口,Service管领域和事务,Mapper管持久化;DTO、DO、VO明确转换,禁止越权批量赋值。 10. 复用、清理与防御并行。只抽取已证实共性,纯通用函数才入Util,领域逻辑留领域Service,不建万能Util或无必要的泛型框架。检查null拆箱、空集合、重复键、金额精度、时间边界与不可信参数;异常保留原因和业务标识,脱敏记录且不假成功。删除无用及重复代码前核对反射、XML、SPI、扫描、序列化和配置引用。规整命名结构,为类、关键字段、枚举及方法写清晰Javadoc和业务原因注释;新增表全部字段及新增字段须用COMMENT或对应语法补齐中文数据库注释,详细说明含义、单位、编码、空值和默认值。格式仅用既有规则及单一工具处理本轮文件,禁止整仓无关格式化,不生成无关Markdown。 11. 用实际结果验收。运行编译、现有检查和必要回归,在隔离验证环境覆盖重复提交、同键异参、多线程争用、越权租户、未知编码、空输入、批量边界、事务回滚、提交后响应丢失、外部成功但本地未确认、重试及过期接管。既核对响应也核对业务记录、金额和副作用次数,禁止仅断言HTTP成功。记录实际执行与未覆盖项;没有执行条件时完成可执行检查,不填写通过。 ## 交付与验收 对比并交付。在相同数据、并发、负载与观测窗口下对比修改前后延迟、吞吐、错误、查询次数和资源,不只报一次平均耗时;确认业务结果一致、尾延迟和下游未恶化。输出已改文件及原因、基线与证据、批量边界、幂等状态与唯一约束方案、事务及外部副作用矩阵、验证记录、回退和剩余风险。新增持久化结构使用项目既有迁移方式并验证历史重复数据与兼容回退;未实测不能声称性能提升,交付实际完成的修改而非待办方案。 格式落地补充:工程缺少成文配置时,以同模块稳定风格制定一套最小规则,明确空格、缩进、换行、空行、导入顺序及成员组织,用兼容的格式化或静态检查工具固化到现有构建。列出实际采用的规则和检查入口,不能只口头要求代码整齐,也不能额外引入相互冲突的格式工具。 ### 本条完成检查 - 交付实际修改及证据,说明 SQL/远程调用、批量内存、事务和幂等约束如何变化。 - 验证同键异参、并发争用、超时未知、过期接管、租户越权和外部副作用次数,不仅检查 HTTP 成功。 - 有实测才比较延迟、吞吐和资源;没有实测则明确未证实收益,并保留回退与历史数据兼容说明。 按本条要求组织结果,使用简洁中文和一致的编号、术语、缩进及空行;已有项目格式优先。只说明实际完成的内容,将采用的假设、未完成项和缺少的条件写在相关位置,不额外生成无关文档。未执行、无法复现或缺少证据的检查如实标注,不宣称已通过或已有性能收益。 ## 参考资料与适用边界 官方依据(2026-09-08核验,具体能力按项目版本确认,不代表完整企业内部规范): - 阿里巴巴《P3C-PMD 公开编码规则》:https://github.com/alibaba/p3c/blob/master/p3c-pmd/README.md - MyBatis《MyBatis 3:Mapper XML Files》:https://mybatis.org/mybatis-3/sqlmap-xml.html - MyBatis《MyBatis 3:Dynamic SQL》:https://mybatis.org/mybatis-3/dynamic-sql.html - Spring《Spring Framework:Using @Transactional》:https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative/annotations.html - Spring《Spring Framework:Rolling Back a Declarative Transaction》:https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative/rolling-back.html 收录核验(2026-09-08):已核对公开资料和本次项目要求的覆盖范围;尚未使用真实项目执行本模板或进行模型效果评测。具体改动、性能和回归结果须在目标工程中验证。
用于订单、审核、库存等写操作,追踪异常、事务提交和外部副作用,避免失败被吞或状态半完成。
## 任务目标 请审查 Java 异常处理与事务结果的一致性。 以核查和评审为主,给出有证据的判断及可复核的修改建议;本次用户另有明确实现要求时,按其授权范围执行。 ## 输入信息(选填) 两项均可留空,也可直接用一句话说明目标并附上已有资料。无需自行整理版本、配置或完整需求表;能读取的内容由执行者补齐。 事务业务操作:从当前异常或写接口定位操作;留空时选择一条同时包含数据库写入与消息、缓存或远程调用的链路,核对用户看到成功的时点。 工程与异常资料:读取业务方法、调用方式、事务管理器与配置、异常类和全局处理器、数据库操作及已有故障测试,自动确定框架版本与回滚行为。 ## 信息不完整时 先使用本次对话中已经说明的信息;用户留空、写“暂无/不清楚”或未替换输入标记,都按缺失处理,不当作真实路径、参数或业务值。已能从资料确定的内容不重复询问,不编造文件、日志、接口、业务值或执行结果。在用户已授权的范围内读取相关工程和材料,不为补齐输入擅自扩大操作范围。 ### 优先确认 - 按顺序追踪校验、数据库变更、消息、缓存和远程调用的可逆性。 - 核对事务代理、自调用、传播、管理器和 rollbackFor 等实际配置。 - 检查 catch、finally、提前返回和统一响应包装是否吞掉原始失败。 - 查找提交后任务、重试、补偿、查询与幂等处理及现有故障样例。 ### 可采用的默认处理 - 默认只读审查并提供最小修复片段,不改异常码、事务边界或执行外部副作用。 - 远程超时归为可能结果未知,不假设本地回滚能撤销外部操作。 - 框架行为以实际配置和调用链为准,缺运行证据时将回滚效果列为待测。 ### 必须有依据的事项 - 用户可见成功的业务定义、允许的部分完成或补偿结果不明确时,不自行把失败转换成成功。 - 外部动作能否查询、撤销或幂等重试的契约未知时,不设计会重复扣款或重复履约的恢复动作。 只有缺口会改变业务结果、权限边界或关键实现,且无法从现有资料确认时,才集中提出最多 3 个关键问题;说明影响,并继续完成不依赖答案的部分。一般命名、排版和可逆实现细节按现有约定决定,不逐项等待确认。 ### 资料仍不足时的交付 - 无工程时交付按失败位置划分的事务结果矩阵和可控故障测试样例。 - 有代码无环境时输出异常传播与事务边界证据,列出核对最终数据和副作用次数的执行步骤。 ## 执行要求 适用范围:Java业务写操作及显式或框架管理的数据库事务;回滚条件必须核对实际框架配置,远程调用和消息不会自动随本地数据库回滚。 结合代码上下文检查异常后的回滚;注意 finally 中的返回可能遮蔽原有结果。 检查步骤: 1. 以一个真实业务操作为单位,按顺序列出校验、数据库变更、消息、缓存和远程请求,标明每个步骤的可逆性,以及用户看见成功的确切时点。 2. 核对事务边界、调用方式和异常到达的位置,分别模拟校验失败、数据库失败、外部超时及运行时异常;不要只看到事务注解就认定回滚一定生效。 3. 检查异常捕获后是否继续执行、改写返回值或丢失原因,区分可以转成业务结果的失败与必须向上交付的技术失败,保留定位问题所需的最少上下文。 4. 对数据库已提交而外部动作失败的情况明确结果,评估幂等重试、补偿和状态对账是否能恢复;对外部成功但响应超时的情况标记结果未知,避免直接重复副作用。 5. 提出能保留现有契约的最小修改,说明异常类型、返回码和事务配置如何协同;只给项目适用的机制,不为了套用模式拆分无必要的微服务。 6. 用可控故障点验证关键步骤,核对数据库最终状态、外部动作次数及用户响应;列出未覆盖的网络分区或并发场景,以及上线后的异常监测和补偿入口。 ## 交付与验收 输出要求:按业务步骤表、异常传播图的文字说明、问题清单、修复片段和故障用例交付。每个用例必须包含初始状态、注入故障、最终数据和预期响应,不能用“未报错”代替一致性结论。 只报告有证据支持的问题;区分“已验证”“推测”和“待验证”,涉及变更时给出受影响文件或对象、最小修改和复核方法。代码与操作示例使用占位符,不写入真实密码。 ### 本条完成检查 - 每个风险关联业务步骤、异常位置、事务结果及用户响应。 - 修复建议保留现有契约并解释数据库提交与外部动作不同步的窗口。 - 用例包含初始状态、故障点、最终数据与响应,不以未报错判定一致性。 按本条要求组织结果,使用简洁中文和一致的编号、术语、缩进及空行;已有项目格式优先。只说明实际完成的内容,将采用的假设、未完成项和缺少的条件写在相关位置,不额外生成无关文档。未执行、无法复现或缺少证据的检查如实标注,不宣称已通过或已有性能收益。 ## 参考资料与适用边界 来源(核验日期:2026-09-08): [阿里巴巴《P3C-PMD 官方公开规则》](https://github.com/alibaba/p3c/blob/master/p3c-pmd/README.md) 整理范围:仅依据上述公开文档的相关建议,业务场景、变量、检查流程与验收格式均为独立改写,不代表相关企业完整内部规范。