177 lines
7.7 KiB
Markdown
177 lines
7.7 KiB
Markdown
# 变更日志:从库数据源注解实现
|
||
|
||
## 元数据
|
||
- 需求编号: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)
|