.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
复制代码

 

posted @   12不懂3  阅读(298)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
创作不易,请勿抄袭,欢迎转载!
点击右上角即可分享
微信分享提示