• .net5 项目配置数据库读写分离和负载均衡多从库查询


    1. 数据库配置读写分离
    2. 项目设置负载均衡查询,注意.net5下面全程使用依赖注入,摒弃掉new事例的方式

    1.数据库配置读写分离 具体查看 https://www.cnblogs.com/LZXX/p/13044841.html

    1.设置一个共享文件夹,设置文件夹EveryOn 完全控制权限---最大的开发权限 配

    2.配置置分发服务器

    3.配置发布

    4.配置订阅

    5.需要注意的是每次表结构更改需要重新更新一下订阅的从库

    2.项目设置负载均衡查询 具体思路就是数据库设置好了读写分离,项目增删改使用主库,查询的时候负载均衡去查询多个从库

    例如控制器里面的一个查询方法如何进行负载均衡

    1.控制器下的查询方法

    2.增加查询枚举类

    3.在相关的查询方法父类里面进行判断枚举

     

    4.设置配置文件依赖注入,主库包含一个数据库链接,从库以逗号分割多个从库数据库链接

    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information"
        }
      },
      "AllowedHosts": "*",
      "ConnectionStrings": {
        "WriteConnection": "Server=DESKTOP-63QE7M1;Database=ZhaoxiNet5DbInfoTest;Trusted_Connection=True;",
        "ReadConnectionList": [
          "Server=DESKTOP-63QE7M1;Database=ZhaoxiNet5DbInfo0001;Trusted_Connection=True;",
          "Server=DESKTOP-63QE7M1;Database=ZhaoxiNet5DbInfo0002;Trusted_Connection=True;",
          "Server=DESKTOP-63QE7M1;Database=ZhaoxiNet5DbInfo0003;Trusted_Connection=True;"
        ]
      }
    }
    appsettings.json

    在satup.cs configservice() 增加:  services.Configure<DBConnectionOption>(Configuration.GetSection("ConnectionStrings"));//注入多个链接 

     public class DBConnectionOption
        {
            /// <summary>
            /// 主库的链接字符串
            /// </summary>
            public string WriteConnection { get; set; }
    
            /// <summary>
            /// 一堆从库的链接字符串
            /// </summary>
            public List<string> ReadConnectionList { get; set; }
        }
    DBConnectionOption

    依赖注入实现

     

     5.最后在具体查询的dbcontext类里面进行判断是主还是从,主库就正常增删改查,从库就设置负载均衡

      public class DbContextFactory : IDbContextFactory
        {
            private DBConnectionOption dBConnections = null;
            private DbContext _Context = null;
            //构造函数
            public DbContextFactory(DbContext context, IOptions<DBConnectionOption> options)
            {
                _Context = context;
                dBConnections = options.Value;
            }
    
            /// <summary>
            /// 在这里的主要职责是要根据不同的操作要选择不同的链接字符串;
            /// 
            /// 字符串分为两类:1.一个字符串(主库)  2.多个字符串
            /// </summary>
            /// <param name="readAndWriteEnum"></param>
            /// <returns></returns>
            public DbContext CreateDbCotnext(ReadAndWriteEnum readAndWriteEnum)
            {
                switch (readAndWriteEnum)
                {
                    case ReadAndWriteEnum.Read:
                        //这里是做做查询
                        return ToRead();
    
                    case ReadAndWriteEnum.Write:
                        //增删改
                        return ToWrite();
    
                    default:
                        throw new Exception("枚举值错误");
                }
            }
    
            private static int staticIndex = 0;
    
            private DbContext ToRead()
            {
    
                //这里就可以选择一下使用哪一个链接字符串;
                #region MyRegion
                //1.随机策略
                {
                    int index = new Random().Next(0, dBConnections.ReadConnectionList.Count);
                    string connectionString = dBConnections.ReadConnectionList[index]; //需要改善 
                    return _Context.ToWriteOrRead(connectionString);
                }
                #endregion
    
                #region 轮训策略---这里没有支持多线程---大家要考虑一下线程安全问题;
                {
                    //string connectionString = string.Empty;
                    //if (staticIndex == dBConnections.ReadConnectionList.Count - 1)
                    //{
                    //    connectionString = dBConnections.ReadConnectionList[staticIndex]; 
                    //    staticIndex = 0;
                    //}
                    //else
                    //{
                    //    connectionString = dBConnections.ReadConnectionList[staticIndex]; 
                    //    staticIndex++;
                    //}
                    //return _Context.ToWriteOrRead(connectionString);
                }
                #endregion
    
                #region 权重策略
              
                #endregion 
            }
    
            private DbContext ToWrite()
            {
                string connectionString = dBConnections.WriteConnection;
                return _Context.ToWriteOrRead(connectionString);
            }
        }
    dbcontext
  • 相关阅读:
    [主席树][学习笔记]
    [bzoj2588][ Count on a tree]
    [bzoj3524][Couriers]
    [luogu3834][可持久化线段树 1(主席树)]
    [luogu3810][bzoj3262][陌上花开]
    [树套树][学习笔记]
    [luogu4556][Vani有约会]
    [线段树合并][学习笔记]
    [hdu6183][Color it]
    [动态开点线段树][学习笔记]
  • 原文地址:https://www.cnblogs.com/LZXX/p/14751662.html
Copyright © 2020-2023  润新知