百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

ShardingCore:EF Core下高性能、轻量级分表分库读写分离解决方案

bigegpt 2024-11-11 11:04 6 浏览

随着现代应用程序对数据处理能力的需求日益增加,单一数据库在面对大规模数据处理时往往会遇到性能瓶颈。分表分库和读写分离成为提升数据库性能、扩展数据库容量的重要手段。在.NET生态系统中,Entity Framework Core(EF Core)作为轻量级、可扩展、开源和跨平台的对象数据库映射器,广泛应用于数据访问层。然而,EF Core原生并不直接支持分表分库和读写分离。因此,一款针对EF Core的高性能、轻量级解决方案——ShardingCore应运而生。

一、ShardingCore简介

ShardingCore是一款专为EF Core设计的高性能、轻量级分表分库框架。它以零依赖、零学习成本和零业务代码侵入的设计理念,为企业级应用提供了灵活的数据层扩展方案。ShardingCore不仅支持EF Core 2+的所有版本和所有支持的数据库,还提供了自定义路由、动态路由、高性能分页、读写分离等功能。

二、ShardingCore的主要特性

  1. 零依赖:ShardingCore不依赖任何其他第三方组件,仅需EF Core即可运行,减少了外部因素带来的复杂性。
  2. 零学习成本:ShardingCore的API设计简洁,与标准EF Core非常接近,对新手开发者友好。
  3. 零业务代码入侵:无需改动业务代码,只需简单配置,便可在后台透明地实现数据分片。
  4. 自动分表分库:支持多种分表分库策略,如时间分表、自定义分表、水平分库等。
  5. 读写分离:支持一主多从的读写分离方案,提升系统响应速度。
  6. 高性能分页:提供特定的高性能分页功能,具有低内存消耗和高效率。
  7. 多数据库支持:支持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 class Order
{
public string Id { get; set; }
public string Payer { get; set; }
public long Money { get; set; }
public string Area { get; set; }
public OrderStatusEnum OrderStatus { get; set; }
public DateTime CreationTime { get; set; }
}

public enum OrderStatusEnum
{
NoPay = 1,
Paying = 2,
Payed = 3,
PayFail = 4
}

3. 创建DbContext

继承AbstractShardingDbContext并实现IShardingTableDbContext接口(如果需要分表):

public class MyDbContext : AbstractShardingDbContext, IShardingTableDbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
{
}

protected override void OnModelCreating(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 class OrderVirtualTableRoute : AbstractSimpleShardingModKeyDateTimeVirtualTableRoute<Order>
{
public OrderVirtualTableRoute() : base(DateTimeIntervalType.Month)
{
}

public override void Configure(EntityMetadataTableBuilder<Order> builder)
{
builder.ShardingProperty(o => o.CreationTime);
builder.AutoCreateTable(o => o.CreationTime);
builder.TableSeparator("_");
builder.TailPrefix("Order");
}
}

5. 配置Startup

Startup.cs中配置ShardingDbContext和路由:

public void ConfigureServices(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都能提供稳定可靠的数据层解决方案,助力企业应对大数据挑战。


相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...