.net5 项目配置数据库读写分离和负载均衡多从库查询
- 数据库配置读写分离
- 项目设置负载均衡查询,注意.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;" ] } }
在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; } }
依赖注入实现
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); } }
本文来自博客园,作者:12不懂3,转载请注明原文链接:https://www.cnblogs.com/LZXX/p/14751662.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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