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

读写分离需求

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

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

CRL内部实现

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

如以下代码

 /// <summary>
/// 返回动态对象的查询
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
internal CallBackDataReader GetQueryDynamicReader(LambdaQueryBase query)
{
CheckTableCreated(query.__MainType);
var sql = "";
query.FillParames(this);
sql = query.GetQuery();
sql = _DBAdapter.SqlFormat(sql);
System.Data.Common.DbDataReader reader;
var compileSp = query.__CompileSp;
var db = GetDBHelper(AccessType.Read);
if (!compileSp)
{
if (query.TakeNum > )
{
db.AutoFormatWithNolock = false;
}
reader = db.ExecDataReader(sql);
}
else//生成储过程
{
string sp = CompileSqlToSp(_DBAdapter.TemplateSp, sql);
reader = db.RunDataReader(sp);
}
query.ExecuteTime = db.ExecuteTime;
ClearParame();
return new CallBackDataReader(reader, null, sql);
}

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

在程序启动处,以Global为例

 protected void Application_Start(object sender, EventArgs e)
{
CRL.SettingConfig.UseReadSeparation = true;//启用主从读写分离
//配置数据连接
CRL.SettingConfig.GetDbAccess = (dbLocation) =>
{
var obj = dbLocation.TagData;
if (dbLocation.ShardingDataBase != null)//按分库判断
{
if (dbLocation.ShardingDataBase.Name == "db1")
{
return WebTest.Code.LocalSqlHelper.TestConnection;
}
else
{
return WebTest.Code.LocalSqlHelper.TestConnection2;
}
}
else
{
//可按type区分数据库
var type2 = dbLocation.ManageType;
if (type2 == typeof(Code.MongoDBTestManage))
{
return Code.LocalSqlHelper.MongoDB;
}
if(dbLocation.AccessType== CRL.AccessType.Read)//区分读写
{
return Code.LocalSqlHelper.TestConnection2;
}
return WebTest.Code.LocalSqlHelper.TestConnection;
}
}; }

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

实际调用

启用主从读写分离

CRL.SettingConfig.UseReadSeparation = true;

更改数据

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

DB1数据被更改

查询数据

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

查询出DB2的数据

事务问题

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

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

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

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

最新源码见文章底部签名

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

  1. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. CRL快速开发框架系列教程十三(嵌套查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. CRL快速开发框架系列教程十一(大数据分库分表解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

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

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  5. CRL快速开发框架系列教程九(导入/导出数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  6. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. CRL快速开发框架系列教程六(分布式缓存解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. CRL快速开发框架系列教程五(使用缓存)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

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

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

随机推荐

  1. C# 弱引用WeakReferance

    在应用程序代码内实例化一个类或结构时,只要有代码引用它,就会形成强引用.例如,如果有一个类MyClass(),并创建一个变量MyClassVariable来引用该类的对象,那么只要在 MyClassV ...

  2. ArrayList 如何完美去除空值

    package sourceCode.ArrayList; import java.util.ArrayList; import java.util.List; public class arrayL ...

  3. setTimeout 倒计时

    <script type="text/javascript"> //设定倒数秒数 var t = 10; //显示倒数秒数 function showTime(){ t ...

  4. Java中的多线程Demo

    一.关于Java多线程中的一些概念 1.1 线程基本概念 从JDK1.5开始,Java提供了3中方式来创建.启动多线程: 方式一(不推荐).通过继承Thread类来创建线程类,重写run()方法作为线 ...

  5. MAC系统操作指令汇总

    OSX 的文件系统 OSX 采用的Unix文件系统,所有文件都挂在跟目录 / 下面,所以不在要有Windows 下的盘符概念. 你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做 US ...

  6. SSH框架搭建 详细图文教程

    转载请标明原文地址 一.什么是SSH? SSH是JavaEE中三种框架(Struts+Spring+Hibernate)的集成框架,是目前比较流行的一种Java Web开源框架. SSH主要用于Jav ...

  7. [ext4]空间管理 - 查找块

     在文件系统中,当需要执行写操作时,肯定是需要查找需要写入的块.那么如何查找块哪? 在Ext4系统中,有两个函数是可能执行查找操作的:ext4_getblk().ext4_get_block(). ...

  8. ICDM评选:数据挖掘十大经典算法

    原文地址:http://blog.csdn.net/aladdina/article/details/4141177 国际权威的学术组织the IEEE International Conferenc ...

  9. centos系统修改网络配置注意事项

    这也是无意之中发现的,我在做一个远程修改工控机网络配置的程序, 网络配置参数/etc/sysconfig/network-scripts/ifcfg-enp1s0下面,当然名字可能不一样ifcfg-e ...

  10. WebGIS开源解决方案之矢量数据导入

    前几篇介绍了开源WebGIS开发环境的搭建,本篇开始陆续介绍这些软件的使用,WebGIS的开发,首要的问题是解决数据来源,本篇主要介绍矢量数据在开源空间数据库PostgreSQL中的存储.后续篇幅中再 ...