Skip to content

多数据源解决方案

在企业级应用开发中,单一数据源往往难以满足复杂的业务场景。不同的业务模块可能需要访问不同的数据库,或者需要将读操作和写操作分离到不同的数据库实例上,以提升系统的处理能力和可用性。

HiMind 工业互联网平台提供了轻量级的动态数据源管理方案,通过配置多组数据库连接字符串,结合简单的工厂方法,即可实现多数据源的灵活切换,有效降低代码耦合度,提升系统扩展性。

HMX 平台动态数据源方案

平台不依赖复杂的第三方中间件,采用 配置驱动 + 工厂方法 的简洁设计,实现了动态数据源的按需获取。

核心设计思路

平台通过配置文件集中管理所有数据源连接信息,业务代码调用时通过数据源标识(dbkey)动态获取对应的数据库连接,从而实现多数据源的灵活切换。

json
{
  "ConnectionStrings": {
    "redis": "10.11.5.52:6379",
    "rabbitmq": "amqp://mes:password@10.11.5.57:5672/dev",
    "influxdb": "http://user:token@10.11.5.59:8086",
    "masterdb": "Oracle://User Id=c##rm;...Size=10;",
    "salesdb": "Oracle://User Id=c##ra;...Pool Size=10;",
    "stockdb": "Oracle://User Id=c##ro;...l Size=10;"
  }
}

应用举例

csharp
/// <summary>
/// 生成综合销售报表
/// </summary>
public async Task<SalesReportDto> GenerateSalesReportAsync(DateTime startDate, DateTime endDate)
{
    // 从销售库获取销售数据
    var salesRepo = GetDbContext("salesdb");
    var salesData = await salesRepo.Query<SalesEntity>()
        .Where(x => x.SalesDate >= startDate && x.SalesDate <= endDate)
        .ToListAsync();

    // 从库存库获取库存周转数据
    var stockRepo = GetDbContext("stockdb");
    var stockTurnover = await stockRepo.Query<StockTurnoverEntity>()
        .Where(x => x.StatDate >= startDate && x.StatDate <= endDate)
        .ToListAsync();

    // 从主库获取产品基础信息
    var masterRepo = GetDbContext();
    var products = await masterRepo.Query<ProductEntity>()
        .Where(x => x.Status == "1")
        .ToDictionaryAsync(x => x.Id, x => x.ProductName);

    // 聚合生成报表
    return new SalesReportDto
    {
        TotalSales = salesData.Sum(x => x.Amount),
        TotalTurnover = stockTurnover.Sum(x => x.TurnoverQty),
        Period = $"{startDate:yyyy-MM-dd} 至 {endDate:yyyy-MM-dd}"
    };
}

设计优势

  • 轻量简洁:不依赖第三方中间件,配置 + 工厂方法即可实现,易于理解
  • 灵活可控:数据源标识由业务层指定,切换逻辑完全由业务掌控
  • 低耦合:数据源配置与业务逻辑分离,各数据源独立管理
  • 易扩展:新增数据源仅需添加配置项,无需修改代码逻辑
  • 高性能:连接池复用数据库连接,减少连接开销

HiMind 工业互联网平台 技术文档