多数据源解决方案
在企业级应用开发中,单一数据源往往难以满足复杂的业务场景。不同的业务模块可能需要访问不同的数据库,或者需要将读操作和写操作分离到不同的数据库实例上,以提升系统的处理能力和可用性。
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}"
};
}设计优势
- 轻量简洁:不依赖第三方中间件,配置 + 工厂方法即可实现,易于理解
- 灵活可控:数据源标识由业务层指定,切换逻辑完全由业务掌控
- 低耦合:数据源配置与业务逻辑分离,各数据源独立管理
- 易扩展:新增数据源仅需添加配置项,无需修改代码逻辑
- 高性能:连接池复用数据库连接,减少连接开销