1. 程式人生 > >CYQ.Data(V5)讀寫分離使用方法 (如何配置與對應的效果)

CYQ.Data(V5)讀寫分離使用方法 (如何配置與對應的效果)

nbsp bsp add sla 表現 sys catch 配置 exception

之前寫過一篇關於CYQ.Data 關於讀寫分離的使用心得。但在測試時,出現過各種的意外表現,未能達到預期效果。然後經過"路過秋天"這幾天的調優以後。各種使用環境均已達到預期效果。

今天在這裏將如何配置,以及對應的配置在使用時的表現整理出來。分享給大家。大家可以在實際使用中對號入座(也歡迎大家自行測試)

一:主備從庫結構一致時

1:配置和測試代碼

      <add name="Conn" connectionString="server=.;uid=sa;pwd=123456;database=Db;" providerName="System.Data.SqlClient"/>
      <add name="Conn_Bak" connectionString="server=.;uid=sa;pwd=123456;database=Db_Bak;" providerName="System.Data.SqlClient"/>
      <add name="Conn_Slave1" connectionString="server=.;uid=sa;pwd=123456;database=Db_Slave1;" providerName="System.Data.SqlClient"/>
      <add name="Conn_Slave2" connectionString="server=.;uid=sa;pwd=123456;database=Db_Slave2;" providerName="System.Data.SqlClient"/>
 //update
                using (MAction action = new MAction("table"))
                {


                    action.SetExpression("pid=‘" + id + "");
                    action.Update("id=1");
                    if (action.RecordsAffected == -2)
                    {
                        res = "update操作異常";
                    }
                }

                //Select
                using (MAction action = new MAction("table"))
                {
                    json = action.Select(1,1).ToJson(false,false);

                }

2:測試條件和結果

  2.1:當所有配置的數據庫連接正常時     
    結果:update和select均操作主庫(如果是只有select操作時,僅從2個從庫上獲取數據(Conn_Slave1,Conn_Slave2),且按序切換)

  2.2:當主庫Conn連接異常時     
    結果:update和select均操作備庫(如果是只有select操作時,僅從2個從庫上獲取數據(Conn_Slave1,Conn_Slave2),且按序切換)

  2.3:當主庫Conn和備庫Conn_Bak均連接異常時     
    結果:update操作失敗,select從2個從庫上獲取數據,不拋出異常,但可使用action.RecordsAffected == -2判斷update操作結果;(如果是只有select操作時,僅從2個從庫上獲取數據(Conn_Slave1,Conn_Slave2),且按序切換)

  2.4:當主庫Conn和備庫Conn_Bak連接均異常,從庫中任何一個連接異常時     
    結果:update操作失敗,select從正常的從庫上獲取數據,不拋出異常,但可使用action.RecordsAffected == -2判斷update操作結果;(如果是只有select操作時,僅從正常的從庫上獲取數據

  2.5:所有配置的數據庫連接均異常時     
    結果:拋出異常;可使用try來捕捉,並按需返回結果

二:主從結構不一致(分庫分表)

1:配置和測試代碼

<add name="Conn" connectionString="server=.;uid=sa;pwd=123456;database=Db;" providerName="System.Data.SqlClient"/>
      <add name="Conn_Bak" connectionString="server=.;uid=sa;pwd=123456;database=Db_Bak;" providerName="System.Data.SqlClient"/>
      <add name="ReadConn_Slave1" connectionString="server=.;uid=sa;pwd=123456;database=Db_Read_Slave1;" providerName="System.Data.SqlClient"/>
      <add name="ReadConn_Slave2" connectionString="server=.;uid=sa;pwd=123456;database=Db_Read_Slave2;" providerName="System.Data.SqlClient"/>

測試代碼(1):無try

 //update
                using (MAction action = new MAction("table"))
                {


                    action.SetExpression("pid=‘" + id + "");
                    action.Update("id=1");
                    if (action.RecordsAffected == -2)
                    {
                        res = "update操作異常";
                    }
                }

                //Select
                using (MAction action = new MAction("table", "ReadConn"))
                {
                    json = action.Select(1, 1).ToJson(false, false);

                }

測試代碼(2):try

try
                {
                    //update
                    using (MAction action = new MAction("table"))
                    {


                        action.SetExpression("pid=‘" + id + "");
                        action.Update("id=1");
                        if (action.RecordsAffected == -2)
                        {
                            res = "update操作異常";
                        }
                    }
                }
                catch (Exception)
                {

                    res = "主/備數據庫均無法正常連接";
                }
               

                //Select
                using (MAction action = new MAction("table", "ReadConn"))
                {
                    json = action.Select(1, 1).ToJson(false, false);

                }

2:測試條件和結果

  2.1:當主或備(Conn/Conn_Bak)任何一個連接正常時     
    結果:update在主或備之間正常的數據庫上進行操作,select從2個從庫上獲取數據(ReadConn_Slave1,ReadConn_Slave2),且按序切換

  2.1:當主或備(Conn/Conn_Bak)均連接異常時     
    測試代碼(1)結果:拋異常。因為在update時發生異常,後續的select無法正常執行     
    測試代碼(2)
結果:       
      初次執行時:異常被捕捉到,res="主/備數據庫均無法正常連接";Select從2個從庫上獲取數據(ReadConn_Slave1,ReadConn_Slave2),且按序切換       
      刷新頁面時:主/備數據庫連接已被認定為無效連接,此時會被判定為無異常,但是內部的異常返回機制會使 res = "update操作異常" 成立;Select依然從2個從庫上獲取數據(ReadConn_Slave1,ReadConn_Slave2),且按序切換

在以上測試中。數據庫之間的切換均非常流暢,無額外的響應等待時間

CYQ.Data(V5)讀寫分離使用方法 (如何配置與對應的效果)