CYQ.Data(V5)讀寫分離使用方法 (如何配置與對應的效果)
之前寫過一篇關於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)讀寫分離使用方法 (如何配置與對應的效果)