2239 字
11 分钟

2026-06-04|多数据源冲突修复与 UAT 联调

一、今日主要工作#

  • 围绕订单关注模块的 UAT 联调,完成订单交付查询失败问题的排查、定位与修复。
  • 深入分析多数据源环境下 MyBatis Mapper 扫描冲突问题,定位 OrderDeliveryMapper 被 SCM 数据源误绑定,导致订单查询 SQL 在错误数据库中执行。
  • 新增 @ScmMapper 自定义注解,并改造 ScmMybatisPlusConfig 的 Mapper 扫描方式,通过白名单过滤解决跨数据源误扫问题。
  • 推进订单关注模块 UAT 优化,完成企微推送连通、轮询间隔调整、状态快照 DB 持久化、关注后即时检测和双用户推送验证。
  • 整理订单关注模块技术设计、代码解析、问题排查与优化修复文档。

二、核心完成内容#

1. UAT 订单查询失败问题排查#

今天首先处理了 UAT 环境中订单交付查询失败的问题。问题现象是调用订单交付查询接口时报错:

Table 'pg_gong_20231020.order_data' doesn't exist

从表面看像是 order_data 表不存在,但进一步分析发现,order_data 实际属于 productsys 库 sf_productsys20240111,而报错却显示 SQL 在 SCM 库 pg_gong_20231020 中执行。因此真正的问题不是表缺失,而是订单查询 Mapper 被绑定到了错误的数据源。

排查过程中先后验证了网络连通性、配置一致性、多数据源初始化情况和 Spring Bean 注册行为。最终定位到 ScmMybatisPlusConfig@MapperScan(basePackageClasses = IvscOrderInfoMapper.class) 会从 IvscOrderInfoMapper 所在包 com.sangfor.pangugong.mapper 开始递归扫描所有子包,导致 mapper.productsys 下的 OrderDeliveryMapper 被 SCM 数据源扫描并注册。

由于 Spring Boot 默认禁止同名 Bean 覆盖,SCM 配置类先加载时抢先注册了 OrderDeliveryMapper,productsys 配置类后续再尝试注册时被拒绝。最终 OrderDeliveryMapper 被错误绑定到 scmSqlSessionFactory,订单查询 SQL 被发到 SCM 库执行,从而报出表不存在。

2. 多数据源扫描冲突修复#

针对该问题,今天新增了 @ScmMapper 自定义注解,作为 SCM 专属 Mapper 的白名单标记:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface ScmMapper {
}

随后将 ScmMybatisPlusConfig 的 Mapper 扫描方式改造为:

@MapperScan(
basePackageClasses = IvscOrderInfoMapper.class,
annotationClass = ScmMapper.class,
sqlSessionFactoryRef = "scmSqlSessionFactory"
)

改造后,即使扫描起点仍是 com.sangfor.pangugong.mapper,也只有标注了 @ScmMapper 的接口会被注册到 SCM 数据源。今天同步为 5 个 SCM 专属 Mapper 添加了该标记。

productsys、oracle、doris 包下的 Mapper 不添加 @ScmMapper,因此不会再被 SCM 数据源误扫。修复后,订单交付查询能够回到正确的 productsys 数据源执行,UAT 订单查询失败问题得到解决。

3. UAT 企微推送连通#

今天还处理了 UAT 环境中企微推送不通的问题。本地调用 qyapi.weixin.qq.com 正常,但 UAT 调度器触发后用户没有收到消息。经过排查,确认原因是 UAT K8s 集群出口防火墙拦截了 qyapi.weixin.qq.com:443

处理方式是协调运维开通 UAT 集群到企业微信 API 的白名单。开通后第一轮测试即收到推送,说明 WecomAppPushService、企微应用配置和推送代码逻辑均正常。

4. 调度器轮询间隔优化#

订单关注模块原先的调度器轮询间隔是 2 小时。该间隔对 UAT 联调和用户体验来说过长。今天将轮询间隔调整为 10 分钟,初始延迟调整为 30 秒。

5. 状态快照从内存缓存改为数据库持久化#

原实现中,调度器使用 ConcurrentHashMap 在内存中记录上次订单状态和预计发货时间。该方式存在重启丢失的问题。今天将状态快照改为持久化到 portal_order_follow 表中的 last_order_statuslast_est_delivery_time 字段,使状态变更检测基准在服务重启后仍然保留。

6. 用户关注后即时检测#

为了提升用户关注订单后的反馈及时性,今天在 OrderFollowService.followOnQuery() 中加入了异步即时检测逻辑。用户查询订单并自动关注成功后,系统会异步调用 scheduler.checkSingleOrder(orderNumber),立即执行一次单订单状态检测。

同时将单订单检测逻辑抽取为公共方法 checkSingleOrder(String orderNumber),让定时扫描和即时检测复用同一套逻辑,降低代码重复和后续维护成本。

7. UAT 双用户推送验证#

今天完成了 UAT 环境下订单关注模块的多场景验证,覆盖用户 66320 和 w47507。验证内容包括:关注后即时检测、发货时间变更推送、已发货推送、已到货推送、已到货后自动取消关注、双用户同时关注同一订单后的推送、DB 持久化快照验证。验证结果均通过。

三、今日工作产出#

  • 完成 UAT 订单查询失败问题排查,定位到 SCM MapperScan 误扫 productsys Mapper 的多数据源冲突问题。
  • 新增 @ScmMapper 自定义注解,并通过 annotationClass 限制 SCM 数据源只注册 SCM 专属 Mapper。
  • 为 5 个 SCM Mapper 添加 @ScmMapper,避免 productsys / oracle / doris Mapper 被 SCM 误绑定。
  • 修复 UAT 订单交付查询 SQL 执行到错误数据库的问题。
  • 完成 UAT 到企业微信 API 的网络白名单开通与推送连通验证。
  • 将订单关注调度器轮询间隔从 2 小时调整为 10 分钟。
  • 将订单状态快照从内存缓存改为数据库持久化。
  • 实现用户关注后异步即时检测,提升状态检测和推送响应速度。
  • 完成 UAT 双用户推送验证,覆盖发货时间变更、已发货、已到货和自动取消关注。
  • 沉淀多份技术文档,包括 UAT 多数据源排查报告、订单关注模块优化与修复报告等。

四、遇到的问题与解决情况#

1. UAT 订单查询 SQL 执行到了错误数据库#

  • 问题:订单查询本应访问 productsys 库,却在 UAT 中访问了 SCM 库,导致 order_data 表不存在。
  • 处理:分析 MyBatis-Spring 的 basePackageClasses 扫描行为,确认 SCM 的 MapperScan 递归扫描了 productsys 子包。
  • 结果:通过 @ScmMapperannotationClass 白名单过滤修复。

2. Mapper Bean 被 SCM 数据源抢先注册#

  • 问题:SCM 配置类先加载时注册了 OrderDeliveryMapper,productsys 配置类后加载时同名 Bean 注册失败。
  • 处理:限制 SCM MapperScan 注册范围,避免其扫描 productsys Mapper。
  • 结果:Mapper 注册边界清晰,productsys Mapper 能绑定到正确的数据源。

3. UAT 企微推送不通#

  • 问题:本地推送正常,但 UAT 用户收不到企微消息。
  • 处理:排查确认 UAT K8s 集群出口被防火墙限制,协调开通 qyapi.weixin.qq.com:443 白名单。
  • 结果:白名单开通后 UAT 推送成功。

4. 内存状态快照重启丢失#

  • 问题:使用 ConcurrentHashMap 记录状态快照时,服务重启后缓存丢失。
  • 处理:将状态快照改为写入 portal_order_follow 表。
  • 结果:状态对比基准持久化,重启后不丢失。

5. 关注后等待调度时间较长#

  • 问题:用户关注后需要等下一轮定时任务才会检测状态。
  • 处理:在关注成功后异步触发 checkSingleOrder(orderNumber)
  • 结果:关注后可立即建立快照或触发状态变化处理。

6. Service 与 Scheduler 存在循环依赖#

  • 问题:OrderFollowService 需要触发 Scheduler,Scheduler 又依赖 Service 查询关注数据。
  • 处理:使用 @Lazy 注入调度器,并抽取公共单订单检测方法。
  • 结果:解决循环依赖,同时提升代码复用性。

五、明日计划#

  • 继续观察 UAT 环境订单关注模块运行情况,重点关注 10 分钟调度器是否稳定。
  • 对多数据源扫描冲突修复进行回归测试。
  • 继续验证更多真实订单场景,包括发货时间变更、已发货、已到货、取消、作废等状态。
  • 完善生产环境部署清单,明确数据库脚本、企微环境变量、防火墙白名单和回滚方案。
  • 根据测试反馈继续优化前端关注列表、角标刷新、空状态和错误提示。
  • 将多数据源 MapperScan、企微推送、调度器快照等排查经验整理为团队通用问题处理参考。

六、总结#

今天主要围绕订单关注模块 UAT 联调和问题修复展开工作。一方面,完成了 UAT 订单查询失败问题的深度排查,定位到 SCM 数据源 MapperScan 递归扫描导致 productsys Mapper 被误绑定,并通过 @ScmMapper 白名单机制修复了多数据源扫描冲突。另一方面,继续优化订单关注模块的企微推送和调度器能力,完成 UAT 企微连通、轮询间隔调整、状态快照 DB 持久化、关注后即时检测和双用户推送验证。通过今天的工作,订单关注模块从本地验证进一步推进到 UAT 可用状态。

2026-06-04|多数据源冲突修复与 UAT 联调
https://jupiter-ws.cn/posts/internship/实习日报-2026-06-04/
作者
Jupiter
发布于
2026-06-04
许可协议
CC BY-NC-SA 4.0