读写分离/主从

配置从表

1.如果存在事务所有操作都走主库,不存在事务 修改、写入、删除走主库,查询操作走从库

2.HitRate 越大走这个从库的概率越大

假设A从库 HitRate设置为5
假设B从库 HitRate设置为10

A的概率为33.3% B的概率为66.6%

SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
                ConnectionString = Config.ConnectionString,//主库
                DbType = DbType.SqlServer,
                IsAutoCloseConnection = true,
                //从库
                SlaveConnectionConfigs = new List<SlaveConnectionConfig>() {
                     new SlaveConnectionConfig() { HitRate=10, ConnectionString=Config.ConnectionString2 } ,
                     new SlaveConnectionConfig() { HitRate=10, ConnectionString=Config.ConnectionString2 }
                }
 });

注意:childDb.Ado.IsValidConnection()如果失败时间可能比较长可以自个写逻辑比如失败就五分钟都不读这个库


配置主从复制

ORM是只把读和写进行了请求处理,数据库的主从复制,数据库的同步需要去数据库里面配置

例如: SqlServer有订阅 或者 alwayson等

强制走主库

1、新功能:5.0.8  用法和Queryable一样

Db.MasterQueryable<T>().Where(x=>x.id==1).ToList() //强制走主库
//5.1.3.22修复了异步不会生效

2、事务

//事务中全部会走主库

3、通过配置走主库

//方式1.强制配置
db.Ado.IsDisableMasterSlaveSeparation=true

反向模式

上面是默认开启读写分离,反向模式是相反的,默认关闭读写分离

5.0.8.6-preview02

//SqlSugarClient 
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
                ConnectionString = Config.ConnectionString,//主库
                DbType = DbType.SqlServer,
                IsAutoCloseConnection = true,
                
                //从库
                SlaveConnectionConfigs = new List<SlaveConnectionConfig>() {
                     new SlaveConnectionConfig() { HitRate=10, ConnectionString=Config.ConnectionString2 } ,
                     new SlaveConnectionConfig() { HitRate=10, ConnectionString=Config.ConnectionString2 }
                }
 });
 db.Ado.IsDisableMasterSlaveSeparation=true;//全局禁止读写分离
 
//SqlSugarScope
static SqlSugarScope db = new SqlSugarScope (new ConnectionConfig()
{
                ConnectionString = Config.ConnectionString,//主库
                DbType = DbType.SqlServer,
                IsAutoCloseConnection = true,
                
                //从库
                SlaveConnectionConfigs = new List<SlaveConnectionConfig>() {
                     new SlaveConnectionConfig() { HitRate=10, ConnectionString=Config.ConnectionString2 } ,
                     new SlaveConnectionConfig() { HitRate=10, ConnectionString=Config.ConnectionString2 }
                }
 },db=>{
      //写在全局配置里面
     db.Ado.IsDisableMasterSlaveSeparation=true;//全局禁止读写分离
 });
 
 
 
 
 
//强制查询从库(注意:事务中还是会查主库)
db.SlaveQueryable<Order>().ToList();//用法和Queryable一样、
//默认查主库
db.Queryable<Order>().ToList();

故障转移

下面只是一个示例,具体写法可以用自已逻辑处理

   SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
   {
                ConnectionString = Config.ConnectionString,//Master Connection
                DbType = DbType.SqlServer,
                InitKeyType = InitKeyType.Attribute,
                IsAutoCloseConnection = true,
                SlaveConnectionConfigs = new List<SlaveConnectionConfig>() {
                   new SlaveConnectionConfig() { HitRate=80,ConnectionString=从库1} ,
                   new SlaveConnectionConfig() { HitRate=20,ConnectionString=从库2}}
    }, cdb =>
            {
                //如果从库1挂了禁用从库1
                var childDb=new SqlSugarClient (...从库1...);
                if(childDb.Ado.IsValidConnection()==false)//不是有效链接
                {
                   //注意这边是cdb不是childDb
                  cdb.CurrentConnectionConfig.SlaveConnectionConfigs[0].HitRate = 0;
                }
                 
     });


多主多从

通过多租户来实现 (先学习一下多租户在看这个比较好理解)

var =slaveConnectionConfigs = new List<SlaveConnectionConfig>() {
                   new SlaveConnectionConfig() { HitRate=80,ConnectionString=从库1} ,
                   new SlaveConnectionConfig() { HitRate=20,ConnectionString=从库2}};
                   
var db = new SqlSugarClient(new List<ConnectionConfig>()
{
 new ConnectionConfig(){ConfigId="0",DbType=DbType.SqlServer,SlaveConnectionConfigs=slaveConnectionConfigs......},
 new ConnectionConfig(){ConfigId="1",DbType=DbType.MySql,SlaveConnectionConfigs=slaveConnectionConfigs....... }
});

var newDb=db.GetConnection(随机获取0和1);
//crud使用 newDb


//事务用法
newDb.Ado.BeginTran//单库
newDb.AsTenant().BeginTran()//多租户事务

//Aop 不能直接 db.Aop 
db.GetConnection(0).Aop.xxx=xxx
db.GetConnection(1).Aop.xxx=xxx

版本问题

SqlSugarScope在单例模式下存密码失效,升级到5.0.5.1

SqlSugarClient   没有问题

关闭
果糖网