多数据源配置
引用文件
本文引用的文件
- DataSourceConstants.java
- DataSourceConstants.java
- DataSourceConstants.java
- YudaoDataSourceAutoConfiguration.java
- DataSourceConfigServiceImpl.java
- DataSourceConfigDO.java
- GoViewDataController.java
- GoViewMysqlDataServiceImpl.java
- GoViewTDEngineDataServiceImpl.java
- RuntimeCountRefactorProperties.java
- datasource.yaml(部署)
- datasource.yaml(通用)
- DataSourceEnum.java
目录
简介
本文件系统化梳理该仓库中的多数据源配置方案,重点围绕以下目标展开:
- 明确 DataSourceConstants 常量类的设计理念与使用方式,覆盖 DEFAULT 主数据源、APP_ACTIVITY 应用活动数据源、TD_API_VISIT 时序数据源等配置项的作用边界。
- 解释多数据源自动配置机制,包括 YudaoDataSourceAutoConfiguration 的实现原理、数据源路由策略、事务管理机制。
- 说明不同业务模块如何按需选择数据源:系统模块使用默认数据源;任务模块使用应用活动数据源;时序数据使用 TDengine 数据源。
- 提供配置最佳实践、性能优化建议与常见故障排查方法。
项目结构
多数据源配置由“配置文件 + 自动装配 + 业务常量 + 运行期路由”四部分协同完成:
- 配置文件:在部署环境与通用环境中分别定义了 MySQL 与 TDengine 的多数据源集合。
- 自动装配:启用事务管理与 Druid 监控过滤器注册。
- 业务常量:各模块以常量形式声明数据源标识,统一命名与语义。
- 运行期路由:通过上下文或注解在运行时切换数据源,确保读写分离与跨库场景正确性。
图表来源
章节来源
核心组件
-
DataSourceConstants 常量类
- 系统模块:DEFAULT = "master"
- 任务模块:DEFAULT、APP_ACTIVITY、TD_ENGINE_APP_ACTIVITY_DAY/MONTH/YEAR、TD_ENGINE_APP_RUNTIME、TD_ENGINE_APP_RUNTIME_ARCHIVE、TASK_UOTA
- 启动器模块:DEFAULT、TD_ENGINE_LAUNCHER_AD_PLAY_DETAIL、TD_ENGINE_LAUNCHER_AD_PLAY_DEVICE_COUNT_*、TD_ENGINE_LAUNCHER_EXEC
- 报表模块:包含 MySQL/TDengine/ES/REDIS 等数据源标识的分支逻辑(用于动态路由)
-
自动装配
- 启用事务管理(proxyTargetClass = true)
- 条件注册 Druid 广告移除过滤器,仅当 Druid 控制台开启时生效
-
运行期路由
- 通过注解或上下文切换数据源,结合 DynamicDataSourceContextHolder.push()/clear() 实现手动切换
- DataSourceEnum 提供 MASTER/SLAVE 的枚举约定
章节来源
- DataSourceConstants.java(系统)
- DataSourceConstants.java(任务)
- DataSourceConstants.java(启动器)
- YudaoDataSourceAutoConfiguration.java
- DataSourceEnum.java
架构总览
多数据源整体架构分为三层:
- 配置层:在部署与通用配置中定义 MySQL 与 TDengine 的多个数据源实例。
- 装配层:自动装配启用事务与 Druid 监控,保证运行期稳定性。
- 路由层:业务通过常量与注解/上下文在运行时选择具体数据源。
图表来源
组件详解
DataSourceConstants 常量类设计与使用
- 设计理念
- 将“数据源标识”集中管理,避免魔法字符串散落各处,提升可维护性与一致性。
- 按模块划分常量,明确 DEFAULT、业务专用(如 APP_ACTIVITY)、时序专用(如 TD_*)等职责边界。
- 使用方式
- 在 Mapper/Service 层通过注解(如 @DS)或运行时 push 切换到指定数据源。
- 在 报表模块中,控制器根据请求参数动态选择对应数据源服务实现。
图表来源
章节来源
多数据源自动配置机制
- YudaoDataSourceAutoConfiguration
- 启用事务管理(proxyTargetClass = true),确保跨数据源事务行为符合预期。
- 条件注册 Druid 广告移除过滤器,仅在 Druid 控制台开启时生效,避免不必要的开销。
- Druid 全局配置
- 通用配置文件中定义了 Druid 监控与慢 SQL 记录、白名单等参数。
- 部署配置文件中定义了连接池大小、空闲检测、最大存活时间等参数。
图表来源
章节来源
数据源路由策略与事务管理
- 路由策略
- 注解优先:在方法上使用 @DS 或 @Master/@Slave 指定数据源。
- 上下文切换:在运行时通过 DynamicDataSourceContextHolder.push()/clear() 手动切换,适用于动态选择场景。
- 枚举约定:DataSourceEnum 提供 MASTER/SLAVE 的统一约定,便于扩展。
- 事务管理
- 启用事务管理(proxyTargetClass = true),确保跨数据源事务的一致性与隔离性。
图表来源
章节来源
不同业务模块的数据源选择
- 系统模块(System)
- 使用 DEFAULT 数据源(master),承载系统与基础设施相关表。
- 任务模块(Task)
- 使用 DEFAULT(master)作为主库。
- 使用 APP_ACTIVITY 数据源承载应用活动相关表。
- 使用 TD_* 系列数据源承载时序数据(应用活跃、设备运行、运行时长归档等)。
- 启动器模块(Launcher)
- 使用 DEFAULT(master)作为主库。
- 使用 TD_* 系列数据源承载启动器广告播放、设备计数等时序数据。
- 报表模块(Report)
- 根据请求数据源标识动态选择 MySQL 或 TDengine 服务实现。
- 通过 DynamicDataSourceContextHolder.push() 在非默认数据源时手动切换。
图表来源
章节来源
时序数据(TDengine)配置与使用要点
- 配置要点
- 在部署配置中定义 TDengine 的多个数据源实例,分别对应不同聚合周期与业务主题(如应用活跃、设备活跃、设备运行、广告播放、API监控等)。
- 使用 Restful JDBC 驱动(com.taosdata.jdbc.rs.RestfulDriver)连接 TDengine。
- 使用要点
- 通过 DataSourceConstants 中的常量标识不同 TDengine 数据源。
- 在报表模块中,控制器根据请求参数动态选择对应服务实现,并在必要时手动切换数据源上下文。
章节来源
- datasource.yaml(部署)
- DataSourceConstants.java(任务)
- DataSourceConstants.java(启动器)
- GoViewDataController.java
设备模块的时序数据配置参考
- RuntimeCountRefactorProperties 展示了设备模块对时序数据的使用思路:通过属性配置当前激活的数据库后缀(如空串或 _shadow),并在重构时动态切换,实现数据源热切换。
- 该模式可用于设备运行时长统计等场景,强调“运行期动态切换”的能力。
章节来源
依赖关系分析
- 配置文件与自动装配
- 配置文件定义了 MySQL 与 TDengine 的数据源集合,自动装配负责启用事务与 Druid 监控。
- 业务常量与路由
- 各模块常量统一了数据源标识,运行期通过注解或上下文进行切换。
- 报表模块的动态路由
- 控制器根据请求参数选择不同数据源的服务实现,体现了“按需路由”的灵活性。
图表来源
- datasource.yaml(部署)
- YudaoDataSourceAutoConfiguration.java
- DataSourceEnum.java
- GoViewDataController.java
- GoViewMysqlDataServiceImpl.java
- GoViewTDEngineDataServiceImpl.java
章节来源
性能与优化
- 连接池参数
- 在通用配置中设置初始连接数、最小空闲、最大活跃、最大等待、空闲检测与最大存活时间等参数,确保连接池健康与低抖动。
- 慢 SQL 监控
- 开启慢 SQL 记录与合并 SQL,有助于定位热点与优化。
- 事务代理
- proxyTargetClass = true 可减少 JDK 动态代理的限制,提升跨数据源事务的兼容性。
- 路由与上下文
- 尽量在方法入口统一切换数据源上下文,避免频繁 push/clear 带来的额外开销。
- 时序数据
- TDengine 使用 Restful 驱动,注意网络延迟与批处理策略,合理分页与聚合窗口以降低查询成本。
章节来源
故障排查
- 数据源连通性
- 通过 DataSourceConfigServiceImpl.validateConnectionOK 校验 URL、用户名、密码是否有效,若失败抛出“数据源不可用”错误。
- 若出现连接失败,检查部署配置中的 URL、用户名、密码与网络连通性。
- 默认数据源补充
- 当查询 ID 为 0 时,系统会从动态数据源属性中补全 master 数据源信息,确保前端或调用方能正确识别默认数据源。
- 控制台访问
- 若 Druid 控制台无法访问,检查 stat-view-servlet.enabled 与 url-pattern 配置,确认白名单与登录凭据。
- 报表数据源选择
- 若控制器提示“不支持的数据源”,检查请求参数 dataSource 是否匹配已定义的常量标识(如 MySQL/TDengine/ES/REDIS)。
章节来源
- DataSourceConfigServiceImpl.java
- DataSourceConfigDO.java
- GoViewDataController.java
- YudaoDataSourceAutoConfiguration.java
结论
该多数据源配置方案通过“集中常量 + 自动装配 + 运行期路由”的组合,实现了 MySQL 与 TDengine 的清晰分离与灵活调度。系统模块使用默认数据源,任务与启动器模块针对应用活动与时序数据分别配置专用数据源,报表模块支持动态路由到不同数据源。配合完善的事务管理与 Druid 监控,能够在保证稳定性的同时满足高性能与可观测性的需求。
附录
- 常用数据源标识速查
- DEFAULT:master
- 任务模块:taskAppActivity、tdAppActivityDay/Month/Year、tdAppRuntime、tdAppRuntimeArchive、uota
- 启动器模块:tdLauncherAdPlayDetail、tdLauncherAdPlayDeviceCountDay/Month/Year、tdLauncherExec
- 报表模块:MySQL/TDengine/ES/REDIS(按请求参数动态选 择)