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

177 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 变更日志:从库数据源注解实现
## 元数据
- 需求编号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 中获取当前激活环境编码
- 添加了 `salesforceConfigCacheManager``getCurrentEnvironmentCodeMethod` 字段,用于缓存 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`
**变更内容**
- 添加了 `@DataSource``DataSourceType` 导入
-`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`
**变更内容**
- 添加了 `@DataSource``DataSourceType` 导入
-`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`
**变更内容**
- 添加了 `@DataSource``DataSourceType` 导入
-`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`
**变更内容**
- 添加了 `@DataSource``DataSourceType` 导入
-`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. 功能扩展
- 支持自定义数据源命名规则
- 支持多级从库数据源主库 -> 从库 -> 二级从库)
## 相关文档
- 需求文档:[2026-01-24-003-从库数据源注解实现.md](../requirements/2026-01-24-003-从库数据源注解实现.md)
- 设计文档:[2026-01-24-003-从库数据源注解实现.md](../design/2026-01-24-003-从库数据源注解实现.md)
- 决策文档:[2026-01-24-003-从库数据源注解实现-技术选型.md](../decisions/adr/2026-01-24-003-从库数据源注解实现-技术选型.md)
- 提示词文档:[2026-01-24-003-prompt-从库数据源注解实现.md](../prompts/2026-01-24-003-prompt-从库数据源注解实现.md)
- 会话记录:[2026-01-24-003-session.md](../sessions/2026-01-24-003-session.md)