随着现代应用程序对数据处理能力的需求日益增加,单一数据库在面对大规模数据处理时往往会遇到性能瓶颈。分表分库和读写分离成为提升数据库性能、扩展数据库容量的重要手段。在.NET生态系统中,Entity Framework Core(EF Core)作为轻量级、可扩展、开源和跨平台的对象数据库映射器,广泛应用于数据访问层。然而,EF Core原生并不直接支持分表分库和读写分离。因此,一款针对EF Core的高性能、轻量级解决方案——ShardingCore应运而生。
一、ShardingCore简介
ShardingCore是一款专为EF Core设计的高性能、轻量级分表分库框架。它以零依赖、零学习成本和零业务代码侵入的设计理念,为企业级应用提供了灵活的数据层扩展方案。ShardingCore不仅支持EF Core 2+的所有版本和所有支持的数据库,还提供了自定义路由、动态路由、高性能分页、读写分离等功能。
二、ShardingCore的主要特性
零依赖 :ShardingCore不依赖任何其他第三方组件,仅需EF Core即可运行,减少了外部因素带来的复杂性。
零学习成本 :ShardingCore的API设计简洁,与标准EF Core非常接近,对新手开发者友好。
零业务代码入侵 :无需改动业务代码,只需简单配置,便可在后台透明地实现数据分片。
自动分表分库 :支持多种分表分库策略,如时间分表、自定义分表、水平分库等。
读写分离 :支持一主多从的读写分离方案,提升系统响应速度。
高性能分页 :提供特定的高性能分页功能,具有低内存消耗和高效率。
多数据库支持 :支持EF Core支持的所有数据库,如SQL Server、MySQL、PostgreSQL等。
三、快速上手
下面将通过具体的C#示例代码,展示如何在项目中集成ShardingCore实现分表分库和读写分离。
1. 安装NuGet包
首先,需要在项目中安装ShardingCore相关的NuGet包。以下以使用SQL Server为例:
Install-Package ShardingCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer
如果使用MySQL,则安装:
Install-Package ShardingCore
Install-Package Pomelo.EntityFrameworkCore.MySql
2. 创建查询对象模型
定义实体类
Order
,用于映射数据库中的订单表:
public classOrder
{
publicstring Id { get; set; }
publicstring Payer { get; set; }
publiclong Money { get; set; }
publicstring Area { get; set; }
public OrderStatusEnum OrderStatus { get; set; }
public DateTime CreationTime { get; set; }
}
publicenum OrderStatusEnum
{
NoPay = 1,
Paying = 2,
Payed = 3,
PayFail = 4
}
3. 创建DbContext
继承
AbstractShardingDbContext
并实现
IShardingTableDbContext
接口(如果需要分表):
public classMyDbContext : AbstractShardingDbContext, IShardingTableDbContext
{
publicMyDbContext(DbContextOptions<MyDbContext> options) : base(options)
{
}
protectedoverridevoidOnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Order>(entity =>
{
entity.HasKey(o => o.Id);
entity.Property(o => o.Id).IsRequired().IsUnicode(false).HasMaxLength(50);
entity.Property(o => o.Payer).IsRequired().IsUnicode(false).HasMaxLength(50);
entity.Property(o => o.Area).IsRequired().IsUnicode(false).HasMaxLength(50);
entity.Property(o => o.OrderStatus).HasConversion<int>();
entity.ToTable(nameof(Order));
});
}
public IRouteTail RouteTail { get; set; }
}
4. 添加分表路由
定义分表路由规则,这里以按月分表为例:
public classOrderVirtualTableRoute : AbstractSimpleShardingModKeyDateTimeVirtualTableRoute<Order>
{
publicOrderVirtualTableRoute() : base(DateTimeIntervalType.Month)
{
}
publicoverridevoidConfigure(EntityMetadataTableBuilder<Order> builder)
{
builder.ShardingProperty(o => o.CreationTime);
builder.AutoCreateTable(o => o.CreationTime);
builder.TableSeparator("_");
builder.TailPrefix("Order");
}
}
5. 配置Startup
在
Startup.cs
中配置ShardingDbContext和路由:
publicvoidConfigureServices(IServiceCollection services)
{
services.AddDbContext<MyDbContext>(options =>
{
options.UseSqlServer("Server=localhost;Database=ShardingDB;User Id=sa;Password=yourpassword;");
});
services.AddShardingDbContext<MyDbContext>()
.AddDefaultDataSource("ds0", "Server=localhost;Database=ShardingDB;User Id=sa;Password=yourpassword;")
.AddShardingTableRoute<OrderVirtualTableRoute>()
.UseShardingOptions(o =>
{
o.EnsureCreatedWithOutShardingTable = true;
o.QueryEfCoreLoggerFactory = efCoreLoggerFactory; // 如果有需要,配置日志
});
}
四、读写分离
ShardingCore支持一主多从的读写分离方案。配置读写分离,通常需要在数据库连接字符串中指定主从数据库,并通过配置服务来启用读写分离。
1. 定义主从数据库连接
在
Startup.cs
中配置主从数据库连接字符串:
services.AddShardingDbContext<MyDbContext>()
.UseRouteConfig(o =>
{
// 主库配置
o.AddDefaultDataSource("ds0", "Server=master_server;Database=MasterDB;User Id=sa;Password=yourpassword;");
// 从库配置
o.AddExtraDataSource(sp => new Dictionary<string, string>
{
{"ds1", "Server=slave_server1;Database=SlaveDB1;User Id=sa;Password=yourpassword;"},
{"ds2", "Server=slave_server2;Database=SlaveDB2;User Id=sa;Password=yourpassword;"}
});
})
// 其他配置...
2. 读写分离策略
ShardingCore支持通过配置策略来控制读写操作分配到不同的数据库。默认情况下,写操作会发送到主库,读操作会根据配置的负载均衡策略分发到从库。
五、总结
ShardingCore作为一款专为EF Core设计的高性能、轻量级分表分库和读写分离解决方案,通过零依赖、零学习成本和零业务代码侵入的设计理念,极大地简化了数据层扩展的复杂性。通过简单的配置和少量的代码改动,即可实现数据的分布式存储和高效的读写操作,为大规模数据处理提供了有力的支持。
在实际项目中,开发者可以根据业务需求灵活配置ShardingCore,实现数据的水平扩展和性能优化。无论是电商系统的订单处理,还是社交网络平台的用户信息管理,ShardingCore都能提供稳定可靠的数据层解决方案,助力企业应对大数据挑战。