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),且按序切换
    补充:

      如果此时只有Select。没有任何写操作时。那么即使主或备(Conn/Conn_Bak)均连接异常时:Select依然从2个从库上获取数据(ReadConn_Slave1,ReadConn_Slave2),且按序切换

 

在以上测试中。数据库之间的切换均非常流畅,无额外的响应等待时间

转载于:https://www.cnblogs.com/xiaozc/p/7854061.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值