Sqlsugar多租户、多数据库

1、 多库和多租户
如果是接口ISugarClient先看一下标题6,看完在看这儿

1.1 固定多数据库模式
数据库数量是固定的一般在声明的全部加上

//通过ConfigId进行数据库区分
var db = new SqlSugarClient(new List()
{
//这儿声名所有上下文都生效
new ConnectionConfig(){ConfigId=“0”,DbType=DbType.SqlServer,ConnectionString=…,IsAutoCloseConnection=true},
new ConnectionConfig(){ConfigId=“1”,DbType=DbType.MySql,ConnectionString=…,IsAutoCloseConnection=true }
});

//定义实体对应ConfigId ,下面0表示ConfigId为0的数据库
[TenantAttribute(“0”)]//对应ConfigId
public class C1Table
{
public string Id { get; set; }
}

//根据特性直接CRUD
var list=db.QueryableWithAttr().ToList();//5.0.9.1 全自动切换库查询
db.InsertWithAttr(list).ExecuteCommand() ;//5.0.9.1 全自动切换库插入
db.UpdateWithAttr(list).ExecuteCommand() ;//5.0.9.1 全自动切换库更新
db.DeleteableWithAttr(list).ExecuteCommand() ;//5.0.9.1 全自动切换库删除

//根据特性获取获取db
var childDb=db.GetConnectionWithAttr();//线程安全用GetConnectionWithAttrScope
var list=childDb.Queryable().ToList();

//手动获取db
var childA=db.GetConnection(“0”);//线程安全用GetConnectionScope
var list=childA.Queryable().ToList();

//事务直接用就行,支持回滚(标题3有原理介绍)
1.2 多租户模式多库
就是一个用户对应一个库,或一个企业对应一个数据库,通过后台维护用户和数据库的方式

//当前上下文不存在则添加
if(!db.IsAnyConnection(configId))
//添加一个db到当前上下文 (Add部分不线上下文不会共享)
db.AddConnection(new ConnectionConfig(){
DbType = SqlSugar.DbType.SqlServer,
ConfigId = “1”,//设置库的唯一标识
IsAutoCloseConnection = true,
ConnectionString = Config.ConnectionString2 });

var currentDb=db.GetConnection(configId);//获取当前上下文存在的db

//单例SqlSugarScope中用AddConnection和IsAnyConnection多用户不会相互影响,不会共享
Saas分库详解:https://www.donet5.com/Home/Doc?typeId=2403

2、详细用例
2.1 子db操作多库 (推荐)
优点灵活,在库的数据不确定的情况下可以使用,比如SAAS分库结合AddConnection和IsAnyConnection使用

主db

SqlSugarClient或者SqlSugarScope我们称为主db

拥租有租户方法:db.BeginTran(事务)、db.GetConnection(获取子Db)等

在多租户中一般只用来 处理事务、创建子DB和获取子DB

可以用 ISqlSugarClien或者ITenant 接收

ISqlSugarClient.AsTenant() 可以转成 ITenant 调用租户方法

子db

通过租户方法GetConnection出来的我们称为子db,没有租户事务相关方法

我们一般用子db去操作指定ConfigId数据库

可以用 ISqlSugarClient 接收,不能转成租户对象 没有租户方法

//主db
var db = new SqlSugarClient(new List()
{
new ConnectionConfig(){ConfigId=“A”,DbType=DbType.SqlServer,ConnectionString=…,IsAutoCloseConnection=true},
new ConnectionConfig(){ConfigId=“B”,DbType=DbType.MySql,ConnectionString=…,IsAutoCloseConnection=true },
new ConnectionConfig(){ConfigId=“C”,DbType=DbType.MySql,ConnectionString=…,IsAutoCloseConnection=true }
});

//获取子Db
var childA=db.GetConnection(“A”);
var childB=db.GetConnection(“B”);
var childC=db.GetConnectionScope(“C”);//线程安全

//使用子Db用
childA.Queryable().ToList();
childB.Queryable().ToList();

//事务看标题3
//线程安全 (推荐)
//线程安全
2.2 根据特性获取(推荐)
适合一个实体和库是一对一的情况

//根据特性获取获取db
var childDb=db.GetConnectionWithAttr();
childDb.Queryable().ToList();

//根据特性直接CRUD
var list=db.QueryableWithAttr().ToList();//5.0.9.1 全自动切换库查询
db.InsertWithAttr(list).ExecuteCommand() ;//5.0.9.1 全自动切换库插入
db.UpdateWithAttr(list).ExecuteCommand() ;//5.0.9.1 全自动切换库更新
db.DeleteableWithAttr(list).ExecuteCommand() ;//5.0.9.1 全自动切换库删除

//如果一个实体对应多个库看SAAS分库文档

//事务看标题3

[TenantAttribute(“1”)]//对应ConfigId
public class C1Table
{
public string Id { get; set; }
}

[TenantAttribute(“2”)]
public class C2Table
{
public string Id { get; set; }
}
2.3 通过切换数据库(不推荐)
切换对设计要求过高,很容切了忘记切回来, 特别是一个请求多次切换

var db = new SqlSugarClient(new List()
{
//这儿声名所有上下文都生效
new ConnectionConfig(){ConfigId=“0”,DbType=DbType.SqlServer,ConnectionString=…,IsAutoCloseConnection=true},
new ConnectionConfig(){ConfigId=“1”,DbType=DbType.MySql,ConnectionString=…,IsAutoCloseConnection=true }
});

//使用默认数据库对象
db.Deleteable().ExecuteCommand();

//切换主db默认值数据库 ConfigId = 1
db.ChangeDatabase(“1”); //改变db.的默认数据库

db.Deleteable().ExecuteCommand();
注意:只在同一个上下文生效,不同上下文不共享

3、多库事务
支持多库、跨服务器和多种数据库混合使用(老版本db.GetConnection要在事务外声名,然后在事务内用变量)

//开启事务
try {

db.BeginTran(); //不能是db.Ado.BeginTran

db.GetConnection(“1”).Insertable(new Order()
{
CreateTime = DateTime.Now,
CustomId = 1,
Name = “a”,
Price = 1
}).ExecuteCommand();

db.GetConnection(“2”).Insertable(new Order()
{
CreateTime = DateTime.Now,
CustomId = 1,
Name = “a”,
Price = 1
}).ExecuteCommand();

//提交事务
db.CommitTran(); //不能是db.ado.CommitTran

}
catch(Exception ex)
{
//回滚事务
db.Rollback();
}

//主db
//注入的SqlSugarClient或者SqlSugarScope我们称为主db

//子db
//通过租户方法GetConnection出来的我们称为子db,用来操作当前数据库,没有租户事务相关方法

//主db可以用事务管理多个子db ,也可以使用 GetConnection等租户方法

//目前底层是业务执行成功后统一提交事务,业务只要失败全部回滚,统一回滚过程中都有有3次重试回滚
//从目前用户使用情况来看,相当稳定几乎没有一例失败的反馈
//高安全级别数据:请使用差异日志+Catch(AggregateException ex)进行补偿机质
//如果回滚失败会throw new AggregateException

4、多租户设置AOP
AOP在多租户是不共享的,需要单独设置,满足更多需求,你可以循环添加

//注意:
//如果你用的 GetConnectionScope或者 GetConnectionScopeWithAttr AOP也应该用 GetConnectionScope
//如果你用的 GetConnection或者 GetConnectionWithAttr AOP也应该用 GetConnectionScope

SqlSugarClient Db= new SqlSugarClient(new ConnectionConfig(){
ConnectionString = “连接符字串”,
DbType = DbType.SqlServer,
IsAutoCloseConnection = true},
db=>{
//也可以这里面循环
db.GetConnection(“1”).Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(“执行1库”+sql);
};
db.GetConnection(“0”).Aop.OnLogExecuting = (sql, pars) =>
{
Console.WriteLine(“执行0库”+sql);
};

});

5、对表进行过滤
db.GetConnection(“A”).QueryFilter.Add(new TableFilterItem(it => it.Name.Contains(“a”),true)
db.GetConnection(“B”).QueryFilter.Add(new TableFilterItem(it => it.Name.Contains(“a”),true)
如果要对表进行数据隔离可以看 查询过滤器的例子

https://www.donet5.com/Home/Doc?typeId=1205

6、ISugarClient使用多租户
问题:Db.GetConnection点不出来,出现这种情况一般是用的接口对象ISqlSugarClient

解决方案: Db.AsTenant().GetConnection(1)

原理如下:

ISqlSugarClient和SqlSugarClient不同,ISqlSugarClient不包含租户方法,原因如下

SqlSugarClient : ISqlSugarClient, ITenant //ISqlSugarClient和ITenant是平行关系,没有租户方法
我们可以通过自带转换实现

ISqlSugarClient db= 注入db ;
db.AsTenant().BeginTran();
db.AsTenant().CommitTran();
db.AsTenant().RollbackTran();
db.AsTenant().GetConnection(1)
db.AsTenant().IsAnyConnection(1)
//低版本 (db as ITenant).BeginTran()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 多租户数据库设计是指在一个数据库中同时存储多个租户(tenant)的数据,其中每个租户拥有自己独立的数据空间,相互之间互不干扰。在SaaS(Software as a Service)应用中,多租户数据库设计是非常常见的,因为这种设计可以有效地节省资源、降低成本,简化维护和升级等操作。 下面是一些常见的多租户数据库设计思路: 1. Schema per Tenant 这种设计思路是为每个租户创建一个独立的数据库模式(schema),在这个模式中存储该租户的所有数据。这种设计思路的优点是简单、容易维护,因为每个租户的数据都是相互独立的。缺点是在租户数量大的情况下,需要频繁地创建和删除模式,可能会影响数据库性能。 2. Shared Database, Shared Schema 这种设计思路是将所有租户的数据存储在同一个数据库中,但是使用相同的模式(schema)来存储数据。在每个表中,增加一个租户ID列,用来标识不同的租户。这种设计思路的优点是简单、易于扩展,但是在查询和索引数据时需要考虑租户ID,可能会影响查询性能。 3. Shared Database, Separate Schemas 这种设计思路是将所有租户的数据存储在同一个数据库中,但是为每个租户创建一个独立的模式(schema),在这个模式中存储该租户的所有数据。这种设计思路的优点是简单、易于维护,但是在查询和索引数据时需要考虑租户ID,并且需要在不同的模式之间切换,可能会影响查询性能。 4. Hybrid Approach 这种设计思路是将上述三种设计思路进行结合,根据实际情况选择最合适的方案。例如,可以为小型租户使用“Schema per Tenant”设计思路,为大型租户使用“Shared Database, Separate Schemas”设计思路,以此来平衡设计的复杂度和查询性能。 总之,多租户数据库设计需要根据具体的业务需求和技术架构来进行选择,需要考虑到数据的安全性、稳定性、可扩展性、性能等多个方面的因素。 ### 回答2: SaaS(Software as a Service,软件即服务)是一种以在线方式交付软件应用程序的业务模式。在这种模式下,多个用户可以共享同一个软件应用程序,每个用户都被分配一个独立的虚拟环境,即多租户。 在设计SaaS多租户数据库时,需要考虑以下几个关键因素: 1. 数据隔离:在多租户环境下,每个用户的数据需要进行隔离,以保证数据的安全性和私密性。可以使用数据库模式化设计来实现数据的隔离,例如每个用户拥有独立的数据库实例。 2. 多租户访问控制:为了保证每个用户只能访问和操作自己的数据,需要设计适当的访问控制机制。可以在数据库层面实现访问权限控制,以及在应用层面实现身份认证和授权机制。 3. 数据共享:尽管在多租户环境下,每个用户的数据是隔离的,但有时候也需要实现数据的共享。可以通过定义公共数据模型或者共享数据表来实现数据的共享,使得多个租户之间可以共享一部分数据。 4. 扩展性和性能:多租户数据库需要支持大规模用户和数据的增长。为了实现良好的扩展性和性能,可以采用分布式数据库架构,将数据分散存储在多个节点上,通过负载均衡和数据分片技术来提高系统的性能和可扩展性。 5. 备份和恢复:多租户数据库需要定期进行备份和恢复操作,以防止数据丢失和灾难发生。可以使用数据库备份和恢复工具,通过设定合适的备份策略和周期,来保证数据的安全性和完整性。 综上所述,设计SaaS多租户数据库需要考虑数据隔离、多租户访问控制、数据共享、扩展性和性能以及备份和恢复等因素,以提供稳定、安全、高效的服务。 ### 回答3: SaaS(Software as a Service)即软件即服务,是一种基于云计算的软件交付模式,用户通过互联网访问和使用软件,而不需要购买和安装在本地服务器上。在SaaS的多租户数据库设计中,多租户是指多个客户共享同一个应用实例和数据库,但彼此之间的数据是相互隔离和保密的。 在多租户数据库设计中,首先需要明确每个租户所需的数据模型和功能,以及他们之间的共享和隔离要求。接下来,需要选择适合多租户的数据架构,常见的有共享数据库和分离数据库两种方式。 共享数据库是将所有租户的数据存储在同一个数据库中,通过在数据表中添加租户ID来区分不同租户的数据。这种方式可以实现资源共享和成本节约,但需要考虑数据隔离和性能问题。 分离数据库是为每个租户分配独立的数据库实例,每个租户有自己的数据表和数据库连接。这种方式可以提供更高的隔离性和性能,但需要更多的资源和成本投入。 无论选择哪种方式,多租户数据库设计需要考虑以下几个方面: 1. 数据隔离:为每个租户保证数据的安全性和隐私性,防止不同租户之间的数据交叉和泄露。 2. 可伸缩性:设计数据库架构和存储方案,以满足不同租户的扩展需求和负载变化。 3. 备份和恢复:建立可靠的备份机制和灾难恢复方案,以保证数据的安全性和可用性。 4. 安全性:采取必要的安全措施,如访问控制、身份验证和加密等,保护数据库免受潜在的安全威胁。 5. 性能优化:通过索引、分区、缓存和查询优化等技术手段,提高数据库的性能和响应速度,满足租户的需求。 总结来说,saas多租户数据库设计需要综合考虑数据隔离、可伸缩性、备份恢复、安全性和性能优化等方面的需求,选择合适的数据架构和存储方案,以满足不同租户的需求,并提供安全可靠的服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值