cyq.data(v5)读写分离使用方法(如何配置与对应的效果)

author author     2022-10-01     167

关键词:

之前写过一篇关于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数据框架使用篇一入门指南

...etail-411 本文针对V5版本进行修改于(2016-07-04)下面是使用步骤:一:下载框架DLL[VS上在NuGet搜cyqdata,或者框架下载地址:下载中心]下载框架后解压出: 1:CYQ.Data.dll和CYQ.Data.Xml(方法注释提示)2:CYQ.Data.Proj 查看详情

cyq.data数据层框架cyq.data数据框架使用篇四maction增删改

本篇内容概要本篇继续上一篇内容,本节介绍所有增删改的相关操作。1:添加数据Insert方法2:删除数据Delete方法3:更新数据Update方法一:添加操作方法原型:public bool Insert()public bool Insert(bool autoSetValue)public&n... 查看详情

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

浅谈orm记得四年前在学校第一次接触到LingtoSql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像 EF,Dapper,Hibernate,ServiceStack.OrmLite 等。当然每种orm都有各自的优势,也有不足的地方。园子... 查看详情

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

浅谈orm  记得四年前在学校第一次接触到LingtoSql,那时候瞬间发现不用手写sql语句是多么的方便,后面慢慢的接触了许多orm框架,像EF,Dapper,Hibernate,ServiceStack.OrmLite 等。当然每种orm都有各自的优势,也有不足的地方。园子... 查看详情

sharding-jdbc几行配置实现读写分离~

...我是不才陈某~今天聊一下如何通过Sharding-JDBC简单的实现读写分离~为什么要读写分离?读写分离则是将事务性的增、改、删操作在主库执行,查询操作在从库执行。一般业务的写操作都是比较耗时,为了避免写操作影响查询的效... 查看详情

cyq.data从入门到放弃orm系列:开篇:自动化框架编程思维

前言:随着CYQ.Data开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头。同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括使用方式,及相关介绍... 查看详情

cyq.data从入门到放弃orm系列:开篇:自动化框架编程思维

前言:随着CYQ.Data开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头。同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括使用方式,及相关介绍... 查看详情

使用amoeba配置mysql读写分离

...间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。要想搭建Amoeba读写分离,首先需要知道MySQL的主从配置。具体的架构图如下图:650)this.width=65... 查看详情

使用adivisor配置增强处理,来实现数据库读写分离

一、先写一个demo来概述Adivisor的简单使用步骤实现步骤:1、通过MethodBeforeAdivice接口实现前置增强处理1publicclassServiceBeforeAdvisorimplementsMethodBeforeAdvice{2privateLoggerlogger=Logger.getLogger(ServiceBeforeAdvisor.class);3@Overr 查看详情

maxscale安装-读写分离

前言关于MySQL中间件的产品也很多,之前用过了360的Atlas、玩过MyCat。这边我选择Maxscale的原因就是功能能满足需求,也看好他的未来发展。其实有关于如何安装Maxscale的文章百度一下一大把,写这篇文章主要为了说明配置的某些现象... 查看详情

redis如何配置读写分离架构(主从复制)?(代码片段)

文章目录Redis如何配置读写分离架构(主从复制)?什么是Redis主从复制?如何配置主从复制架构?配置环境安装Redis步骤通过命令行配置从节点通过配置文件配置从节点redis主从复制优点redis主从复制缺点Redis... 查看详情

sharding-jdbc读写分离探秘(代码片段)

...,而且使用配置都非常干净。官方支持的功能还包括读写分离、分布式主键、强制路由等。这里再介绍下如何在分库分表的基础上集成读写分离的功能。读写分离的概念就是为了缓解数据库压力,将写入和读取操作分离... 查看详情

读写分离注解

  以前写过读写分离,今天完善成文档。 一:概述1.结构文档    2.思路  组装好各个数据源,然后通过注解选择使用读或者写的数据源,将其使用AbstractRoutingDataSource中的方法determineCurrentLookuoKey进行选择datasourc... 查看详情

spring配置双数据源并读写分离

           摘自开源项目Ibase4j  关键思想在于AbstractRoutingSource类还有方法名称和切入点去控制使用哪个数据源  1.首先在配置文件配置多个数据源并且交给继承自springAbstractRout... 查看详情

springjpa读写分离

本文主要解决基于springdatajpa读写分离。思想:在dataSource做路由,根据事务判断使用主从数据源。背景:spring+springdatajpa(hibernatejpa)首先是jpa配置,时间有限在原基础上该的,既有java配置也有xml配置,见谅。先声明EntityManagerXml... 查看详情

redis读写分离

参考技术A主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,master以写为主,slave以读为主配置从机的方式有两种,一种是通过slaveof命令进行配置,另一种是通过配置文件1.使用slaveof命令配置当前机器为从机2.... 查看详情

spring读写分离-事务配置篇(转)(代码片段)

转自:http://jinnianshilongnian.iteye.com/blog/1720618如何配置mysql数据库的主从?单机配置mysql主从:http://my.oschina.net/god/blog/496 常见的解决数据库读写分离有两种方案1、应用层http://neoremind.net/2011/06/spring实现数据库读写分 查看详情

秒懂mybatis之读写分离简单实现(代码片段)

...;因为只是想了下,于是还是不知道…直到有一天要搞读写分离…最近又看到了这个话题,于是就叨叨几句。在生产环境中搞读写分离一般采用成熟的第三方方案,例如代理模式的mycat,以及客户端模式的sharding-jdbc... 查看详情