.NET下資料庫的負載均衡(有趣實驗)

来源:https://www.cnblogs.com/dotnet-college/archive/2022/09/26/16724819.html
-Advertisement-
Play Games

相關下載: 資料庫的負載均衡-示例代碼(dp1-DbBalance.rar) 資料庫的負載均衡-示例代碼(dp1-DbBalance.rar) 支持.Net/.Net Core/.Net Framework 為了演示資料庫的負載均衡(Load Balance),我們先創建三個資料庫,它們的名字分別為 ...


相關下載:

資料庫的負載均衡-示例代碼(dp1-DbBalance.rar)

資料庫的負載均衡-示例代碼(dp1-DbBalance.rar)

支持.Net/.Net Core/.Net Framework

為了演示資料庫的負載均衡(Load Balance),我們先創建三個資料庫,它們的名字分別為YZZ、YZZ1、YZZ2。然後在這三個資料庫中分別創建表t_Student,這些表的結構一樣,內容稍有差異,見下圖:

YZZ中t_Student的內容

---------------------

Id  Name  Age

1   張安   25

2   王鑫   22

3   周雲   20

YZZ1中t_Student的內容

---------------------

Id  Name  Age

1   張安1  25

2   王鑫1  22

3   周雲1  20

YZZ2中t_Student的內容

---------------------

Id  Name  Age

1   張安2  25

2   王鑫2  22

3   周雲2  20

 

然後,我們在ds.xml這個配置文件中設置如上三個數據源的負載均衡策略,文件內容如下:

<?xml version="1.0" encoding="utf-8" ?>
<DeveloperSharp>
    <DatabaseClusterList>
        <DatabaseCluster Id="StudentData">
            <Database Id="A1" Enable="true" Weight="100" DatabaseType="SqlServer" ConnectionString="Server=localhost;Database=YZZ;Uid=sa;Pwd=123"/>
            <Database Id="A2" Enable="true" Weight="100" DatabaseType="SqlServer" ConnectionString="Server=localhost;Database=YZZ1;Uid=sa;Pwd=123"/>
            <Database Id="A3" Enable="true" Weight="100" DatabaseType="SqlServer" ConnectionString="Server=localhost;Database=YZZ2;Uid=sa;Pwd=123"/>
        </DatabaseCluster>
    </DatabaseClusterList> 
</DeveloperSharp>

 

對此xml配置文件說明如下:

(1)     每一個DatabaseCluster節點代表了一組資料庫,此節點的Id值(本文示例值是:StudentData)後續會在程式中使用。

(2)     Database節點中的Weight屬性代表了使用權重。本文示例的三個資料庫的Weight值分別是100、100、100,則這三個資料庫的負載均衡使用分配比例將會是1:1:1。若把這三個值分別設置為100、50、50,則這三個資料庫的使用分配比例將會變為2:1:1。設置成你想要的比例吧。

(3)     Database節點中的Enable屬性代表了是否可用。true代表可用,false代表不可用。

(4)     .Net6中可通過把DatabaseType屬性的值設置為“MySql”、“SQLite”、“PostgreSql”、“Oracle”、其它等等,從而支持各種類資料庫。

 

接下來,我們看看怎麼在程式中使用上述的這組資料庫及其配置文件,來實現負載均衡。

為了演示負載均衡效果,我們首先在Visual Studio中新建一個控制台工程,併為工程引用添加了Entity Framework組件作為訪問資料庫的工具(你也可以換成其它資料庫訪問工具,原理一樣,完全不受影響)。

然後,我們做如下四個操作。

【第一步】:從NuGet引用DeveloperSharp包。

【第二步】:在工程配置文件App.config(.Net6/VS2022中亦可添加此配置文件)中添加appSettings節點,節點內容如下:

  <appSettings>
    <add key="DatabaseType" value="" />
    <add key="ConnectionString" value="" />
    <add key="ErrorPage" value="" />
    <add key="ErrorLog" value="D:\Test\Assist\log.txt" />
    <add key="ConfigFile" value="D:\Test\Assist\ds.xml" />
  </appSettings>

其中,ConfigFile的設置是為了鏈接前述的ds.xml這個配置文件。ErrorLog則是設置一個錯誤日誌文件。它們均需要設置為文件的“絕對路徑”(此處使用“絕對路徑”而不是“相對路徑”,一是有利於安全性,二是有利於分散式部署)

【第三步】:創建一個StudentLB.cs類文件,它就是資料庫負載均衡的核心器件,內容如下:

    //這個屬性就是用作映射負載均衡。
    //其“值”需設置為前述ds.xml配置文件中某個DatabaseCluster節點的Id值。
    [DeveloperSharp.Structure.Model.LoadBalance.DataSourceCluster("StudentData")]
    public class StudentLB : DeveloperSharp.Structure.Model.DataLayer
    {
        //類中沒有任何代碼
    }

說明:“負載均衡器”類(本篇為:StudentLB類)必須繼承自DeveloperSharp.Structure.Model.DataLayer類,並且在其上設置DeveloperSharp.Structure.Model.LoadBalance.DataSourceCluster屬性的初始化值為ds.xml配置文件中某個DatabaseCluster節點的Id值。

 

【第四步】:為控制台應用類,添加通過負載均衡器(StudentLB類)訪問資料庫的代碼,註意:核心代碼就一行而已!!此示例連續3次訪問資料庫做同一操作,看會顯示什麼結果。如下:

    class Program
    {
        static void Main(string[] args)
        {
            string NameList = "";

            //第一次訪問資料庫
            var SLB = (new StudentLB()) as DeveloperSharp.Structure.Model.DataLayer;
            var db = new Entities(SLB.IDA.ConnectionString);//每次會根據配置的負載均衡策略輸出對應的ConnectionString
            t_Student Stu = db.t_Student.Where(t => t.Id == 3).FirstOrDefault();
            NameList += Stu.Name;

            //第二次訪問資料庫
            SLB = (new StudentLB()) as DeveloperSharp.Structure.Model.DataLayer;
            db = new Entities(SLB.IDA.ConnectionString);//每次會根據配置的負載均衡策略輸出對應的ConnectionString
            Stu = db.t_Student.Where(t => t.Id == 3).FirstOrDefault();
            NameList += Stu.Name;

            //第三次訪問資料庫
            SLB = (new StudentLB()) as DeveloperSharp.Structure.Model.DataLayer;
            db = new Entities(SLB.IDA.ConnectionString);//每次會根據配置的負載均衡策略輸出對應的ConnectionString
            Stu = db.t_Student.Where(t => t.Id == 3).FirstOrDefault();
            NameList += Stu.Name;

            //輸出
            Console.WriteLine(NameList);
            Console.ReadLine();

        }
    }

從以上示例代碼我們可以清晰的得知:其實資料庫鏈接字元串ConnectionString就是實現負載均衡的關鍵所在。而SLB.IDA.ConnectionString則每次會根據配置的負載均衡策略輸出對應的鏈接字元串。

 

示常式序輸出顯示結果如下:

周雲周雲1周雲2

 

 

最後提示一點:若要把一組資料庫的負載均衡應用改為單資料庫應用,只需要把ds.xml配置文件中DatabaseCluster節點下的Database節點數量設置為一個即可實現。所以,聰明的你以後可以把你所有的資料庫訪問代碼改為本文樣式:)

 

總結

本文技術點思路梳理:

  1. 創建用來實施負載均衡的一組資料庫。
  2. 通過ds.xml來配置負載均衡策略。
  3. 在App.config/Web.config中添加鏈接ds.xml的appSettings節點。
  4. 創建基於DeveloperSharp包的“負載均衡器”類(本篇為:StudentLB類)。
  5. 通過“負載均衡器”產生的ConnectionString鏈接資料庫。

 

【附註】:文章開頭給出的下載示例,均已成功運行通過。但有些輔助內容需要自己建立/設置(比如:資料庫創建、鏈接字元串設置、文件配置、路徑設置、參數設定、等等...)。調式時若遇異常報錯,請仔細閱讀+理解本文。技術交流/支持,請微信掃描二維碼,備註“進群”!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇文章我們學習了使用註解開發,但還沒有完全脫離xml的配置,現在我們來學習JavaConfig配置來代替xml的配置,實現完全註解開發。 下麵我們用一個簡單的例子來進行學習。 一、首先建立兩個實體類 User: package com.jms.pojo; import org.springfra ...
  • 服務註冊中心 Nacos 官網:home (nacos.io) nacos-server下載地址:Releases · alibaba/nacos (github.com) 第一步:運行nacos-server nacos-server-2.1.1\nacos\bin 目錄下打開命令行視窗,輸入st ...
  • 順序存儲二叉樹的概念 從數據存儲來看,數組存儲方式和樹的存儲方式可以相互轉換,即數組可以轉換成樹,樹也可以轉換成數組, 看下麵的示意圖。 要求: 右圖的二叉樹的結點,要求以數組的方式來存放 arr : [1, 2, 3, 4, 5, 6, 6] 要求在遍曆數組 arr 時,仍然可以以前序遍歷,中序遍 ...
  • 函數 1.字元串函數 #(1)add() 對兩個數組的元素進行字元串連接 import numpy as np print(np.char.add(["xiaodu"],["good"])) print(np.char.add(["xiaodu","dudu"],["good","nice"])) ...
  • 事情是這樣的:今天晚上,女朋友讓我十二點催她睡覺。 不過,可是我實在太困了,熬不下去…… 是吧?女朋友哪有睡覺重要? 但,女朋友的命令,我是不敢違抗的…… 但是睡覺也不能缺! 這時候我們該怎麼辦呢?是時候讓Python登場了! Python登場這次我們來做一個自動發送微信的程式,在深夜十二點的時候給 ...
  • 1、初衷 開發中經常需要做一些介面的簽名生成和校驗工作,最開始的時候都是每個介面去按照約定單獨實現,久而久之就變的非常難維護,因此就琢磨怎麼能夠寫了一個比較通用的簽名生成工具。 2、思路 採用鏈式調用的方式,使得簽名的步驟可以動態拼湊組合。 3、直接看效果 //設置數據源 var signSourc ...
  • .Net7 的到來的同時,也帶來了 C# 11,而令我最期待的就是 C# 11 的 原始字元串了,當我知道這個的時候,簡直比過年還要開心。 非原始字元串 首先我們看看現在寫字元串的方式 var str = @" 雪莉:""有人在嗎?"" 神樂:""他們有事出去了,你有什麼困擾呢? 萬事屋神樂為您服務 ...
  • 1. 發佈打包前端管理平臺(ant-design-vue) 2. 發佈打包後端(.NET6-WebApi) .NET6 webAPI orm: free sql 資料庫:mysql5.7 3. 發佈打包H5端(uni) 播放器使用: import Player from 'xgplayer'; // ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...