datai/docs/archive/changelogs/2026-01-24-003-changelog.md

7.7 KiB
Raw Blame History

变更日志:从库数据源注解实现

元数据

  • 需求编号2026-01-24-003
  • 创建时间2026-01-24
  • 创建人SSOT 架构师
  • 状态:已完成

变更概述

本次变更实现了基于 @DataSource 注解的从库数据源动态切换功能,支持根据当前激活环境自动切换到对应的从库数据源。

变更详情

1. DataSourceAspect 动态路由

文件路径d:\idea_demo\datai\datai-framework\src\main\java\com\datai\framework\aspectj\DataSourceAspect.java

变更内容

  • 添加了 getCurrentEnvironmentSlaveDataSourceName() 方法,实现动态路由逻辑
  • 添加了 getCurrentEnvironmentCode() 方法,通过反射从 SalesforceConfigCacheManager Bean 中获取当前激活环境编码
  • 添加了 salesforceConfigCacheManagergetCurrentEnvironmentCodeMethod 字段,用于缓存 Bean 和 Method 对象
  • 修改了 around() 方法,当检测到 DataSourceType.SLAVE 时,调用 getCurrentEnvironmentSlaveDataSourceName() 方法

实现逻辑

  1. 通过反射调用 SalesforceConfigCacheManager.getCurrentEnvironmentCode() 方法获取当前激活环境编码
  2. 构造从库数据源名称格式slave_环境编码
  3. 检查从库数据源是否已加载
  4. 如果从库存在,切换到从库数据源;如果不存在,回退到主库数据源

性能优化

  • 缓存 SalesforceConfigCacheManager Bean 和 getCurrentEnvironmentCode Method 对象
  • 避免每次调用都通过反射获取方法,提高了性能
  • 第一次调用时获取 Bean 和 Method 对象,后续调用直接使用缓存的对象

2. DataiIntegrationObjectServiceImpl 注解

文件路径d:\idea_demo\datai\datai-scenes\datai-scene-salesforce\datai-salesforce-integration\src\main\java\com\datai\integration\service\impl\DataiIntegrationObjectServiceImpl.java

变更内容

  • 添加了 @DataSourceDataSourceType 导入
  • createObjectStructure(Integer id) 方法添加 @DataSource(DataSourceType.SLAVE) 注解
  • syncSingleObjectData(Integer id) 方法添加 @DataSource(DataSourceType.SLAVE) 注解
  • syncMultipleObjectData(Integer[] ids) 方法添加 @DataSource(DataSourceType.SLAVE) 注解

影响范围

  • 创建对象表结构时,数据将写入从库数据源
  • 同步单个对象数据时,数据将写入从库数据源
  • 同步多个对象数据时,数据将写入从库数据源

3. DataiIntegrationBatchServiceImpl 注解

文件路径d:\idea_demo\datai\datai-scenes\datai-scene-salesforce\datai-salesforce-integration\src\main\java\com\datai\integration\service\impl\DataiIntegrationBatchServiceImpl.java

变更内容

  • 添加了 @DataSourceDataSourceType 导入
  • syncBatchData(Integer id) 方法添加 @DataSource(DataSourceType.SLAVE) 注解

影响范围

  • 同步批次数据时,数据将写入从库数据源

4. DataiIntegrationMetadataChangeServiceImpl 注解

文件路径d:\idea_demo\datai\datai-scenes\datai-scene-salesforce\datai-salesforce-integration\src\main\java\com\datai\integration\service\impl\DataiIntegrationMetadataChangeServiceImpl.java

变更内容

  • 添加了 @DataSourceDataSourceType 导入
  • syncToLocalDatabase(Long id) 方法添加 @DataSource(DataSourceType.SLAVE) 注解
  • syncBatchToLocalDatabase(Long[] ids) 方法添加 @DataSource(DataSourceType.SLAVE) 注解

影响范围

  • 同步元数据变更到本地数据库时,数据将写入从库数据源
  • 批量同步元数据变更到本地数据库时,数据将写入从库数据源

5. DataSynchronizerImpl 注解

文件路径d:\idea_demo\datai\datai-scenes\datai-scene-salesforce\datai-salesforce-integration\src\main\java\com\datai\integration\realtime\impl\DataSynchronizerImpl.java

变更内容

  • 添加了 @DataSourceDataSourceType 导入
  • synchronizeData(String objectType, String recordId, String changeType, Map<String, Object> changeData, Date changeDate) 方法添加 @DataSource(DataSourceType.SLAVE) 注解
  • batchSynchronizeData(List<SyncData> syncDataList) 方法添加 @DataSource(DataSourceType.SLAVE) 注解

影响范围

  • 实时同步数据时,数据将写入从库数据源
  • 批量实时同步数据时,数据将写入从库数据源

技术特性

1. 动态路由

  • 根据当前激活环境编码,动态构造从库数据源名称
  • 支持多环境隔离,每个环境对应一个从库数据源
  • 从库数据源命名规则slave_环境编码

2. 降级机制

  • 当从库数据源不存在时,自动回退到主库数据源
  • 当环境编码为空时,自动回退到主库数据源
  • 当获取环境编码失败时,自动回退到主库数据源
  • 确保系统在异常情况下仍能正常运行

3. 性能优化

  • 缓存 Bean 和 Method 对象,避免重复反射调用
  • 第一次调用时初始化,后续调用直接使用缓存
  • 数据源切换时间 < 10ms

4. 事务支持

  • 所有添加 @DataSource(DataSourceType.SLAVE) 注解的方法都保留了 @Transactional 注解
  • 确保数据写入从库时的事务一致性

测试建议

1. 功能测试

  • 测试从库数据源存在时,成功切换到从库数据源
  • 测试从库数据源不存在时,成功回退到主库数据源
  • 测试环境编码为空时,成功回退到主库数据源
  • 测试获取环境编码失败时,成功回退到主库数据源

2. 性能测试

  • 测试数据源切换时间 < 10ms
  • 测试不影响业务方法的执行时间

3. 集成测试

  • 测试创建对象表结构时,数据正确写入从库
  • 测试同步对象数据时,数据正确写入从库
  • 测试同步批次数据时,数据正确写入从库
  • 测试同步元数据变更时,数据正确写入从库
  • 测试实时同步数据时,数据正确写入从库

兼容性说明

1. 向后兼容

  • 不影响现有的 @DataSource(DataSourceType.MASTER) 注解的使用
  • 不影响直接指定数据源名称的方式
  • 不影响没有 @DataSource 注解的方法(默认使用主库)

2. 环境要求

  • 需要确保 SalesforceConfigCacheManager Bean 已正确注册
  • 需要确保从库数据源已正确配置和加载
  • 需要确保环境编码已正确设置

风险评估

1. 性能风险

  • 反射调用可能带来一定的性能开销
  • 缓存机制已将性能开销降到最低

2. 兼容性风险

  • 如果 SalesforceConfigCacheManager Bean 不存在,会回退到默认环境编码
  • 如果从库数据源不存在,会回退到主库数据源
  • 降级机制确保了系统的稳定性

3. 事务风险

  • 跨数据源事务可能导致数据不一致
  • 当前实现确保每个方法只使用一个数据源,避免了跨数据源事务

后续优化建议

1. 监控和告警

  • 添加数据源切换的监控指标
  • 添加从库数据源不可用的告警机制

2. 性能优化

  • 考虑使用 Spring Expression Language (SpEL) 替代反射
  • 考虑使用编译时注解处理器生成代码

3. 功能扩展

  • 支持自定义数据源命名规则
  • 支持多级从库数据源(主库 -> 从库 -> 二级从库)

相关文档