跳到主要内容

多数据源配置

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 组件详解
  6. 依赖关系分析
  7. 性能与优化
  8. 故障排查
  9. 结论
  10. 附录

简介

本文件系统化梳理该仓库中的多数据源配置方案,重点围绕以下目标展开:

  • 明确 DataSourceConstants 常量类的设计理念与使用方式,覆盖 DEFAULT 主数据源、APP_ACTIVITY 应用活动数据源、TD_API_VISIT 时序数据源等配置项的作用边界。
  • 解释多数据源自动配置机制,包括 YudaoDataSourceAutoConfiguration 的实现原理、数据源路由策略、事务管理机制。
  • 说明不同业务模块如何按需选择数据源:系统模块使用默认数据源;任务模块使用应用活动数据源;时序数据使用 TDengine 数据源。
  • 提供配置最佳实践、性能优化建议与常见故障排查方法。

项目结构

多数据源配置由“配置文件 + 自动装配 + 业务常量 + 运行期路由”四部分协同完成:

  • 配置文件:在部署环境与通用环境中分别定义了 MySQL 与 TDengine 的多数据源集合。
  • 自动装配:启用事务管理与 Druid 监控过滤器注册。
  • 业务常量:各模块以常量形式声明数据源标识,统一命名与语义。
  • 运行期路由:通过上下文或注解在运行时切换数据源,确保读写分离与跨库场景正确性。

Mermaid Diagram Code:

graph TB
A["配置文件<br/>datasource.yaml部署/通用"] --> B["自动装配<br/>YudaoDataSourceAutoConfiguration"]
B --> C["业务常量<br/>各模块 DataSourceConstants"]
C --> D["运行期路由<br/>DynamicDataSourceContextHolder/注解"]
D --> E["MySQL 数据源集合"]
D --> F["TDengine 数据源集合"]

图表来源

章节来源

核心组件

  • 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 的枚举约定

章节来源

架构总览

多数据源整体架构分为三层:

  • 配置层:在部署与通用配置中定义 MySQL 与 TDengine 的多个数据源实例。
  • 装配层:自动装配启用事务与 Druid 监控,保证运行期稳定性。
  • 路由层:业务通过常量与注解/上下文在运行时选择具体数据源。

Mermaid Diagram Code:

graph TB
subgraph "配置层"
P1["MySQL 系统/基础设施/工作流/报表/黑名单/启动器/设备/任务/UOTA"]
P2["TDengine 启动器广告/设备活跃/设备运行/应用活跃/应用运行/API监控"]
end
subgraph "装配层"
A1["YudaoDataSourceAutoConfiguration<br/>事务+Druid过滤器"]
end
subgraph "路由层"
R1["注解 DS/Master/Slave"]
R2["DynamicDataSourceContextHolder<br/>push()/clear()"]
R3["业务常量 DataSourceConstants"]
end
P1 --> A1
P2 --> A1
A1 --> R1
A1 --> R2
R3 --> R1
R3 --> R2

图表来源

组件详解

DataSourceConstants 常量类设计与使用

  • 设计理念
    • 将“数据源标识”集中管理,避免魔法字符串散落各处,提升可维护性与一致性。
    • 按模块划分常量,明确 DEFAULT、业务专用(如 APP_ACTIVITY)、时序专用(如 TD_*)等职责边界。
  • 使用方式
    • 在 Mapper/Service 层通过注解(如 @DS)或运行时 push 切换到指定数据源。
    • 在报表模块中,控制器根据请求参数动态选择对应数据源服务实现。

Mermaid Diagram Code:

classDiagram
class SystemDataSourceConstants {
+DEFAULT = "master"
}
class TaskDataSourceConstants {
+DEFAULT = "master"
+APP_ACTIVITY = "taskAppActivity"
+TD_ENGINE_APP_ACTIVITY_DAY = "tdAppActivityDay"
+TD_ENGINE_APP_ACTIVITY_MONTH = "tdAppActivityMonth"
+TD_ENGINE_APP_ACTIVITY_YEAR = "tdAppActivityYear"
+TD_ENGINE_APP_RUNTIME = "tdAppRuntime"
+TD_ENGINE_APP_RUNTIME_ARCHIVE = "tdAppRuntimeArchive"
+TASK_UOTA = "uota"
}
class LauncherDataSourceConstants {
+DEFAULT = "master"
+TD_ENGINE_LAUNCHER_AD_PLAY_DETAIL = "tdLauncherAdPlayDetail"
+TD_ENGINE_LAUNCHER_AD_PLAY_DEVICE_COUNT_DAY = "tdLauncherAdPlayDeviceCountDay"
+TD_ENGINE_LAUNCHER_AD_PLAY_DEVICE_COUNT_MONTH = "tdLauncherAdPlayDeviceCountMonth"
+TD_ENGINE_LAUNCHER_AD_PLAY_DEVICE_COUNT_YEAR = "tdLauncherAdPlayDeviceCountYear"
+TD_ENGINE_LAUNCHER_EXEC = "tdLauncherExec"
}

图表来源

章节来源

多数据源自动配置机制

  • YudaoDataSourceAutoConfiguration
    • 启用事务管理(proxyTargetClass = true),确保跨数据源事务行为符合预期。
    • 条件注册 Druid 广告移除过滤器,仅在 Druid 控制台开启时生效,避免不必要的开销。
  • Druid 全局配置
    • 通用配置文件中定义了 Druid 监控与慢 SQL 记录、白名单等参数。
    • 部署配置文件中定义了连接池大小、空闲检测、最大存活时间等参数。

Mermaid Diagram Code:

sequenceDiagram
participant Boot as "Spring Boot"
participant AutoCfg as "YudaoDataSourceAutoConfiguration"
participant Druid as "DruidStatProperties"
participant Filter as "DruidAdRemoveFilter"
Boot->>AutoCfg : 加载自动配置
AutoCfg->>Druid : 读取控制台配置
AutoCfg->>Filter : 条件注册过滤器
Note over AutoCfg,Filter : 仅当stat-view-servlet.enabled=true时生效

图表来源

章节来源

数据源路由策略与事务管理

  • 路由策略
    • 注解优先:在方法上使用 @DS 或 @Master/@Slave 指定数据源。
    • 上下文切换:在运行时通过 DynamicDataSourceContextHolder.push()/clear() 手动切换,适用于动态选择场景。
    • 枚举约定:DataSourceEnum 提供 MASTER/SLAVE 的统一约定,便于扩展。
  • 事务管理
    • 启用事务管理(proxyTargetClass = true),确保跨数据源事务的一致性与隔离性。

Mermaid Diagram Code:

flowchart TD
Start(["进入业务方法"]) --> CheckAnno["是否存在@DS/@Master/@Slave注解?"]
CheckAnno --> |是| UseAnno["使用注解指定的数据源"]
CheckAnno --> |否| CheckCtx["是否在调用前push过数据源?"]
CheckCtx --> |是| UseCtx["使用上下文中的数据源"]
CheckCtx --> |否| UseDefault["使用默认数据源(master)"]
UseAnno --> Tx["事务管理器生效"]
UseCtx --> Tx
UseDefault --> Tx
Tx --> End(["结束"])

图表来源

章节来源

不同业务模块的数据源选择

  • 系统模块(System)
    • 使用 DEFAULT 数据源(master),承载系统与基础设施相关表。
  • 任务模块(Task)
    • 使用 DEFAULT(master)作为主库。
    • 使用 APP_ACTIVITY 数据源承载应用活动相关表。
    • 使用 TD_* 系列数据源承载时序数据(应用活跃、设备运行、运行时长归档等)。
  • 启动器模块(Launcher)
    • 使用 DEFAULT(master)作为主库。
    • 使用 TD_* 系列数据源承载启动器广告播放、设备计数等时序数据。
  • 报表模块(Report)
    • 根据请求数据源标识动态选择 MySQL 或 TDengine 服务实现。
    • 通过 DynamicDataSourceContextHolder.push() 在非默认数据源时手动切换。

Mermaid Diagram Code:

sequenceDiagram
participant Ctrl as "GoViewDataController"
participant Svc as "GoViewDataService"
participant Holder as "DynamicDataSourceContextHolder"
Ctrl->>Ctrl : 解析dataSource参数
alt MySQL
Ctrl->>Svc : 返回GoViewMysqlDataServiceImpl
Svc->>Holder : push(dataSource)
Svc-->>Ctrl : 返回查询结果
Svc->>Holder : clear()
else TDengine
Ctrl->>Svc : 返回GoViewTDEngineDataServiceImpl
Svc->>Holder : push(dataSource)
Svc-->>Ctrl : 返回查询结果
Svc->>Holder : clear()
else 其他
Ctrl-->>Ctrl : 抛出不支持的数据源异常
end

图表来源

章节来源

时序数据(TDengine)配置与使用要点

  • 配置要点
    • 在部署配置中定义 TDengine 的多个数据源实例,分别对应不同聚合周期与业务主题(如应用活跃、设备活跃、设备运行、广告播放、API监控等)。
    • 使用 Restful JDBC 驱动(com.taosdata.jdbc.rs.RestfulDriver)连接 TDengine。
  • 使用要点
    • 通过 DataSourceConstants 中的常量标识不同 TDengine 数据源。
    • 在报表模块中,控制器根据请求参数动态选择对应服务实现,并在必要时手动切换数据源上下文。

章节来源

设备模块的时序数据配置参考

  • RuntimeCountRefactorProperties 展示了设备模块对时序数据的使用思路:通过属性配置当前激活的数据库后缀(如空串或 _shadow),并在重构时动态切换,实现数据源热切换。
  • 该模式可用于设备运行时长统计等场景,强调“运行期动态切换”的能力。

章节来源

依赖关系分析

  • 配置文件与自动装配
    • 配置文件定义了 MySQL 与 TDengine 的数据源集合,自动装配负责启用事务与 Druid 监控。
  • 业务常量与路由
    • 各模块常量统一了数据源标识,运行期通过注解或上下文进行切换。
  • 报表模块的动态路由
    • 控制器根据请求参数选择不同数据源的服务实现,体现了“按需路由”的灵活性。

Mermaid Diagram Code:

graph LR
CFG["datasource.yaml"] --> AC["YudaoDataSourceAutoConfiguration"]
AC --> ENUM["DataSourceEnum"]
AC --> CTX["DynamicDataSourceContextHolder"]
CONST["各模块 DataSourceConstants"] --> CTX
CTRL["GoViewDataController"] --> SVC["GoViewMysqlDataServiceImpl/GoViewTDEngineDataServiceImpl"]
CTRL --> CTX

图表来源

章节来源

性能与优化

  • 连接池参数
    • 在通用配置中设置初始连接数、最小空闲、最大活跃、最大等待、空闲检测与最大存活时间等参数,确保连接池健康与低抖动。
  • 慢 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)。

章节来源

结论

该多数据源配置方案通过“集中常量 + 自动装配 + 运行期路由”的组合,实现了 MySQL 与 TDengine 的清晰分离与灵活调度。系统模块使用默认数据源,任务与启动器模块针对应用活动与时序数据分别配置专用数据源,报表模块支持动态路由到不同数据源。配合完善的事务管理与 Druid 监控,能够在保证稳定性的同时满足高性能与可观测性的需求。

附录

  • 常用数据源标识速查
    • DEFAULT:master
    • 任务模块:taskAppActivity、tdAppActivityDay/Month/Year、tdAppRuntime、tdAppRuntimeArchive、uota
    • 启动器模块:tdLauncherAdPlayDetail、tdLauncherAdPlayDeviceCountDay/Month/Year、tdLauncherExec
    • 报表模块:MySQL/TDengine/ES/REDIS(按请求参数动态选择)
用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答