access 分表存储_详解在.net core中完美解决多租户分库分表的问题

本文介绍了如何在.NET Core应用程序中实现多租户分库分表的功能。通过CRL库,我们可以轻松地根据登录信息动态切换数据库,并通过自定义定位规则来确定正确的数据库和表。示例代码展示了如何注册定位配置和数据访问构建,以实现高效的数据查询。最终,这种解决方案在没有增加过多耦合的情况下,提供了简单易用的多租户数据库访问方式。
摘要由CSDN通过智能技术生成

前几天有人想做一个多租户的平台,每个租户一个库,可以进行水平扩展,应用端根据登录信息,切换到不同的租户库

计划用ef core实现,他们说做不出来,需要动态创建dbContext,不好实现

然而这个使用CRL很轻松就能解决了

以下为演示数据库,有两个库testdb和testdb2,查询结果如下

目标:

根据传入登录信息连不不同的库,查询返回结果,如登录人为01,返回d1.default,登录人为02 返回 d2.default

实际上这个需求就是分库分表的实现,通过设置数据库/表映射关系,根据传入的定位数据进行匹配,找到正确的库表配置,生成数据访问对象

以core控制台程序为例

class Program

{

static IServiceProvider provider;

static Program()

{

var services = new ServiceCollection();

services.AddCRL();

services.AddScoped();

provider = services.BuildServiceProvider();

provider.UseCRL();

}

static void Main(string[] args)

{

label1:

var instance = provider.GetService();

var data = new Code.Sharding.MemberSharding();

data.Code = "01";

instance.SetLocation(data);

var find1 = instance.QueryItem(b => b.Id > 0)?.Name;

Console.WriteLine($"定位数据输入{data.Code},查询值为{find1}");

data.Code = "02";

instance.SetLocation(data);

var find2 = instance.QueryItem(b => b.Id > 0)?.Name;

Console.WriteLine($"定位数据输入{data.Code},查询值为{find2}");

Console.ReadLine();

goto label1;

}

}

上面代码中,通过SetLocation方法传入定位数据Code,通过QueryItem方法查询出数据并打印出来

通过services.AddCRL()注入定位配置,DBLocationCreator继承了接口IDBLocationCreator

这里完全符合core注入规范,可以通过配置或数据库存储动态读取定位设置

public class DBLocationCreator : IDBLocationCreator

{

ISettingConfigBuilder _settingConfigBuilder;

public DBLocationCreator(ISettingConfigBuilder settingConfigBuilder)

{

_settingConfigBuilder = settingConfigBuilder;

}

public void Init()

{

//自定义定位

_settingConfigBuilder.RegisterLocation((t, a) =>

{

var tableName = t.TableName;

var dbName = a.Code == "02" ? "testdb2" : "testdb";

var dataBase = $"Data Source=.;Initial Catalog={dbName};User ID=sa;Password=123";

//返回定位库和表名

return new CRL.Sharding.Location(dataBase, tableName);

});

_settingConfigBuilder.RegisterDBAccessBuild(dbLocation =>

{

var connectionString = "Data Source=.;Initial Catalog=testdb;User ID=sa;Password=123";

if (dbLocation.ShardingLocation != null)

{

connectionString = dbLocation.ShardingLocation.DataBaseSource;

}

return new CRL.DBAccessBuild(DBType.MSSQL, connectionString);

});

}

}

在Init方法里,实现了两个操作,通过RegisterLocation定义如何根据定位数据Code,返回不同的库/表

通过RegisterDBAccessBuild实现数据访问

运行测试程序,结果输出为

上面代码通过自定义定位参数和定位规则,没有任何耦合,调用也很简单,完美达到了预期效果

到此这篇关于详解在.net core中完美解决多租户分库分表的问题的文章就介绍到这了,更多相关.net core多租户分库分表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值