CYQ.Data(V5)读写分离使用方法 (如何配置与对应的效果)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)读写分离使用方法 (如何配置与对应的效果)的主要内容,如果未能解决你的问题,请参考以下文章

CYQ.Data V5 数据库读写分离功能介绍

CYQ.Data V5 分布式缓存MemCached应用开发介绍

终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

CYQ.Data V5 分布式自动化缓存设计介绍

CYQ.Data 数据框架 使用篇一 入门指南

EF通用数据层封装类(支持读写分离,一主多从)