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

177 lines
7.7 KiB
Markdown
Raw Normal View 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 中获取当前激活环境编码
- 添加了 `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)