您现在的位置是:网站首页> 编程资料编程资料
详解在.net core中完美解决多租户分库分表的问题_实用技巧_
2023-05-24
351人已围观
简介 详解在.net core中完美解决多租户分库分表的问题_实用技巧_
前几天有人想做一个多租户的平台,每个租户一个库,可以进行水平扩展,应用端根据登录信息,切换到不同的租户库
计划用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
这里完全符合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实现数据访问
运行测试程序,结果输出为

上面代码通过自定义定位参数和定位规则,没有任何耦合,调用也很简单,完美达到了预期效果
测试代码地址:https://github.com/CRL2020/CRL.NetStandard/tree/master/Test/CRLCoreTest
到此这篇关于详解在.net core中完美解决多租户分库分表的问题的文章就介绍到这了,更多相关.net core多租户分库分表内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
相关内容
- ASP.NET Core中的Controller使用示例_实用技巧_
- ASP.NET Core单文件和多文件上传并保存到服务端的方法_实用技巧_
- ASP .NET Core API发布与部署以及遇到的坑和解决方法_实用技巧_
- c# rabbitmq 简单收发消息的示例代码_实用技巧_
- 在IIS上部署ASP.NET Core Web API的方法步骤_实用技巧_
- 在 asp.net core 的中间件中返回具体的页面的实现方法_实用技巧_
- ASP.NET Core中修改配置文件后自动加载新配置的方法详解_实用技巧_
- ASP.NET Core学习之使用JWT认证授权详解_实用技巧_
- Asp.Net Core 中的“虚拟目录”实现_实用技巧_
- ASP.NET Core 配置和使用环境变量的实现_实用技巧_
