7.7 KiB
变更日志:从库数据源注解实现
元数据
- 需求编号: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()方法
实现逻辑:
- 通过反射调用
SalesforceConfigCacheManager.getCurrentEnvironmentCode()方法获取当前激活环境编码 - 构造从库数据源名称(格式:slave_环境编码)
- 检查从库数据源是否已加载
- 如果从库存在,切换到从库数据源;如果不存在,回退到主库数据源
性能优化:
- 缓存 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. 功能扩展
- 支持自定义数据源命名规则
- 支持多级从库数据源(主库 -> 从库 -> 二级从库)