CRL快速开发框架4.4版发布,支持主从读写分离

经过一些调整和优化,4.3已经运行在生产环境,对于不久将会遇到的查询性能,读写分离需求列上日程

读写分离需求

对于一个数据库作了主从发布/订阅,主库为DB1,从库为DB2

所有写入通过DB1,所有查询通过DB2,当然也可以通过DB1

CRL内部实现

在CRL内部调用,请求读和请求写的方法会标记为Read或Write,然后再通过标记实现不同的数据库连接访问对象

如以下代码

 1 /// <summary>
 2         /// 返回动态对象的查询
 3         /// </summary>
 4         /// <param name="query"></param>
 5         /// <returns></returns>
 6         internal CallBackDataReader GetQueryDynamicReader(LambdaQueryBase query)
 7         {
 8             CheckTableCreated(query.__MainType);
 9             var sql = "";
10             query.FillParames(this);
11             sql = query.GetQuery();
12             sql = _DBAdapter.SqlFormat(sql);
13             System.Data.Common.DbDataReader reader;
14             var compileSp = query.__CompileSp;
15             var db = GetDBHelper(AccessType.Read);
16             if (!compileSp)
17             {
18                 if (query.TakeNum > 0)
19                 {
20                     db.AutoFormatWithNolock = false;
21                 }
22                 reader = db.ExecDataReader(sql);
23             }
24             else//生成储过程
25             {
26                 string sp = CompileSqlToSp(_DBAdapter.TemplateSp, sql);
27                 reader = db.RunDataReader(sp);
28             }
29             query.ExecuteTime = db.ExecuteTime;
30             ClearParame();
31             return new CallBackDataReader(reader, null, sql);
32         }

GetDBHelper方法将此标记传到数据访问对象创建层

在程序启动处,以Global为例

 1 protected void Application_Start(object sender, EventArgs e)
 2         {
 3             CRL.SettingConfig.UseReadSeparation = true;//启用主从读写分离
 4             //配置数据连接
 5             CRL.SettingConfig.GetDbAccess = (dbLocation) =>
 6             {
 7                 var obj = dbLocation.TagData;
 8                 if (dbLocation.ShardingDataBase != null)//按分库判断
 9                 {
10                     if (dbLocation.ShardingDataBase.Name == "db1")
11                     {
12                         return WebTest.Code.LocalSqlHelper.TestConnection;
13                     }
14                     else
15                     {
16                         return WebTest.Code.LocalSqlHelper.TestConnection2;
17                     }
18                 }
19                 else
20                 {
21                     //可按type区分数据库
22                     var type2 = dbLocation.ManageType;
23                     if (type2 == typeof(Code.MongoDBTestManage))
24                     {
25                         return Code.LocalSqlHelper.MongoDB;
26                     }
27                     if(dbLocation.AccessType== CRL.AccessType.Read)//区分读写
28                     {
29                         return Code.LocalSqlHelper.TestConnection2;
30                     }
31                     return WebTest.Code.LocalSqlHelper.TestConnection;
32                 }
33             };
34
35         }

这样就实现了在逻辑调用上实现了读写分离

实际调用

启用主从读写分离

CRL.SettingConfig.UseReadSeparation = true;

更改数据

var item = Code.ProductDataManage.Instance.QueryItem(2);
item.ProductName = "更改主库数据为" + DateTime.Now.Second;
Code.ProductDataManage.Instance.Update(item);

DB1数据被更改

查询数据

 var item = Code.ProductDataManage.Instance.QueryItem(2);
            Response.Write("从库数据2为" + item.ProductName);

查询出DB2的数据

事务问题

由于主从复制可能存在延迟,在事务中可不想查到脏数据,或者数据在事务中被更改

因此,在事务内需要由主库查询

在CRL事务范围内的查询,都默认为主库

此功能测试代码见文档/Page/ReadSeparation.aspx

最新源码见文章底部签名

时间: 2024-11-07 15:19:51

CRL快速开发框架4.4版发布,支持主从读写分离的相关文章

CRL快速开发框架系列教程十(导出对象结构)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

CRL快速开发框架系列教程二(基于Lambda表达式查询)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

CRL快速开发框架系列教程四(删除数据)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

CRL快速开发框架系列教程三(更新数据)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

C#操作SqlServer MySql Oracle通用帮助类Db_Helper_DG(默认支持数据库读写分离、查询结果实体映射ORM)

[前言] 作为一款成熟的面向对象高级编程语言,C#在ADO.Net的支持上已然是做的很成熟,我们可以方便地调用ADO.Net操作各类关系型数据库,在使用了多年的Sql_Helper_DG后,由于项目需要,于是乎,就准备写一个Mysql_Helper在实现过程中,发现ADO.Net封装之完善,以及面向对象的封装.继承.多态,有了这些特性,何不把数据库操作封装成为一个通用的类呢,此文由此铺展而来... [实现功能] 这篇文章将要介绍的主要内容如下: 1.ADO.NET之SqlServer 2.ADO

CodeIgniter 3.0支持数据库读写分离方式

网上有部分方法,支持读写分离,但过于复制,而且有的只支持2.0版本的,现在改善一个,支持3.0版本的读写分离 本次修改的环境是: CodeIgniter 3.0.3 MySQL 5.5+ PHP 5.5.9 nginx 1.1.8 步骤一:修改application/config/database.php 数据库读.写连接参数的配置. $active_group = 'default'; $query_builder = TRUE; $db['default'] = array( 'dsn' =

基于 EntityFramework 的数据库主从读写分离架构(2)- 改进配置和添加事务支持

回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramework\MasterSlaves 上一回中(http://www.cnblogs.com/cjw0511/p/4398267.html),我们简单讲述了基于 EF 来实现数据库读写分离的原理.当然,这只是一个 demo 级别的简单实现,实际上,在我们工作环境中,碰到的情况远比这复杂多了,例如数据库连接的配置是通过 c

深蓝词库转换2.7版发布——支持Mac原生输入法词库,QQ拼音新词库qcel格式

2020年过年期间,由于冠状病毒肺炎的流行,在家无事,就把搁置了很久的词库进行了改进.发布了2.7版:https://github.com/studyzy/imewlconverter/releases/tag/v2.7.0 转眼深蓝词库转换从诞生到现在都已经10个年头了,这是我做的最久的软件了.本次2.7版的更新主要包含了以下新特性: 一.MacOS原生简体拼音输入法自定义短语词库的支持 在MacOS的“系统偏好设置”中选择“键盘”,“文本”,即可看到,Mac简体拼音输入法的自定义短语词库.

.NET Core前后端分离快速开发框架(Core.3.0+AntdVue)

.NET Core前后端分离快速开发框架(Core.3.0+AntdVue) 目录 引言 简介 环境搭建 开发环境要求 基础数据库构建 数据库设计规范 运行 使用教程 全局配置 快速开发 管理员登录 系统用户管理 系统角色管理 权限管理 接口秘钥管理 系统日志 单库事务 跨库事务 读写分离分库分表 常见疑问 如何进行联表查询 如何切换数据库类型 如何使用多个数据库 引言 时间真快,转眼今年又要过去了.回想今年,依次开源发布了Colder.Fx.Net.AdminLTE(254Star).Cold