# 变更日志:从库数据源注解实现 ## 元数据 - 需求编号: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 changeData, Date changeDate)` 方法添加 `@DataSource(DataSourceType.SLAVE)` 注解 - 为 `batchSynchronizeData(List 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)