回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录:
src\ NDF.Data.EntityFramework\MasterSlaves
在本上的上一篇博文中(基于 EntityFramework 的数据库主从读写分离服务插
件,http://www.cnblogs.com/cjw0511/p/4391092.html),概述性的介绍了自己基于 EF6 写的一个用于数据库主从读写分离服务的一个插件。因为时间关系,上一篇博文只讲到了该插件的功能概述和基本用法。今天正好有空,就花点时间构思了这篇博文,和大家一起来交流一下,本人基于 EF6 的数据库主从读写分离服务插件是如何构思、设计以及编码实现的。

首先,在继续进行本文的后续内容阅读之前,应该先对一些相关知识点有所了解,包括但不限于如下几个方面:
1、ADO.NET 基础知识;
2、EntityFramework 的功能和基本用法;
3、数据库读写分离的概念(http://baike.baidu.com/view/3372624.htm);
4、数据库主从复制功能的基本配置(不同数据库系统配置方式不同);
以上几点是阅读和实现本文所述的数据库主从读写分离的基础知识,本文就不做详细赘述了,如有想在这些方面另需了解的同学,请自行补课。
好了,接下来进入正题吧。
我们都知道,在应用程序开发中,要实现数据库的主从读写分离操作,也就是让所有的数据变更操作请求都指向 Master(主) 服务器,而所有的数据查询请求都指向 Slave(从)服务器,其根本就在于构建 ADO.NET 的 DbConnection 连接时,ConnectionString 的指向不同。在以前,没有用 ORM 框架时,我们可能通过自定义一些诸如 DataAccessHelper 的工具类,在工具类型定义两大类型的 API,其一为数据库变更操作,其二为数据查询操作。在数据库变更操作中,生成的 DbConnection 的连接地址指向 Master 服务器;在数据查询操作时,生成的 DbConnection 指向另一台 Slave 服务器。
而如今,由于需要分离关注点、提高代码复用性和编码工作效率、降低程序员对 sql 的知识依赖等诸多原因,我们用上了 EntityFramework、NHibernate 等类似的 ORM 框架。实际上,在 ORM 框架中,要实现数据库读写分离,和我们早期直接用 ADO.NET 来实现该功能的原理是一样的。而不同之处,主要就在于,ORM 框架一般提供了AOP 架构的切面注入方式,让我们可以在某个关注点上添加我们自定义的操作。
在 EntityFramework 的 6.1 版本中,新增了一个命名空间 System.Data.Entity.Infrastructure.Interception,该命名空间主要就是提供了一个面向切面的程序注入功能,让我们可以在 EF 最终向数据库提交 DbCommand 执行请求前后,拦截到该动作并执行我们自定义的其他附加动作。基本的做法为:
1、自定义一个 System.Data.Entity.Infrastructure.Interception.DbCommandInterceptor 类型的子类;
2、在该自定义类型中重写方法 ReaderExecuting、ReaderExecuted、ScalarExecuting、ScalarExecuted、NonQueryExecuting、NonQueryExecuted,方法体内即可实现自己对查询命令、更改命令的执行前后附加动作;
3、通过 System.Data.Entity.Infrastructure.Interception.DbInterception.Add 方法,将该自定义的类型实例添加至 EF 执行上下文中;
完成以上几个步骤后,EF 即可在每次执行增删改或查询命令前后,额外我们我们定义的其他动作。
废话不多说,下面贴上一段代码,用于表示实现 EF 读写分离效果的 DbCommandInterceptor 基本实现:
 1 public class DbMasterSlaveCommandInterceptor : DbCommandInterceptor
 2     {
 3         private string masterConnectionString = "server=192.168.0.99;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb";
 4         private string slaveConnectionString = "server=192.168.0.101;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb";
 5         public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
 6         {
 7             this.UpdateConnectionString(interceptionContext, this.slaveConnectionString);
 8         }
 9         public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
10         {
11             this.UpdateConnectionString(interceptionContext, this.slaveConnectionString);
12         }
13         public override void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
14         {
15             this.UpdateConnectionString(interceptionContext, this.masterConnectionString);
16         }
17         private void UpdateConnectionString(DbInterceptionContext interceptionContext, string connectionString)
18         {
19             foreach (var context in interceptionContext.DbContexts)
20             {
21                 this.UpdateConnectionString(context.Database.Connection, connectionString);
22             }
23         }
24         private void UpdateConnectionString(DbConnection conn, string connectionString)
25         {
26             ConnectionState state = conn.State;
27             if (state == ConnectionState.Open)
28                 conn.Close();
29             conn.ConnectionString = connectionString;
30             if (state == ConnectionState.Open)
31                 conn.Open();
32         }
33     }

接着,在 Global.asax 的启动代码中将该 类型的实体注入 EF 全局执行上下文中。

1 public class MyHttpApplication : HttpApplication
2     {
3         protected void Application_Start()
4         {
5             DbInterception.Add(new DbMasterSlaveCommandInterceptor());
6         }
7     }

怎么样,原理是不是很简单?当然,如果想要实现一些丰富的配置和扩展功能,就还需要很多其他的代码了,关于这些本人将会在后续文章中逐步介绍!

转载于:https://www.cnblogs.com/cjw0511/p/4398267.html

基于 EntityFramework 的数据库主从读写分离架构(1) - 原理概述和基本功能实现...相关推荐

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

    回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramework\Maste ...

  2. ef mysql 读写分离_基于 EntityFramework 的数据库主从读写分离服务插件

    基于 EntityFramework 的数据库主从读写分离服务插件 1. 版本信息和源码 1.1版本信息 v1.01 beta(2015-04-07),基于 EF 6.1 开发,支持 EF 6.1 之 ...

  3. Django项目配置mysql主从数据库实现读写分离

    1.在配置文件中添加slave数据库的配置 DATABASES = {     'default': {         'ENGINE': 'django.db.backends.mysql',   ...

  4. 数据库之架构:主备+分库?主从+读写分离?

    数据库之架构:主备+分库?主从+读写分离? 原文:数据库之架构:主备+分库?主从+读写分离? 一.数据库架构原则 高可用 高性能 一致性 扩展性 二.常见的架构方案 方案一:主备架构,只有主库提供读写 ...

  5. 数据库读写分离架构详解

    RD:数据量太大,数据库扛不住了,帮忙申请一个从库,读写分离. DBA:数据量多少? RD:5000w左右. DBA:读写吞吐量呢? RD:读QPS约200,写QPS约30左右. 额,数据库读写分离虽 ...

  6. mysql查询并设置高亮_Thinkphp3.2.3设置MySql主从读写分离后,简单调用主数据库查询

    图/文:迷神 Thinkphp是一款不错的国产框架,使用范围广,应用也比较多.随着网站访问增大往往需要使用mysql主从同步功能,本身Thinkphp自带了主从读写分离的功能了. 但是我们经常有一个场 ...

  7. MySQL数据库:读写分离

    一.读写分离的原理: 1.实现原理: 读写分离解决的是,数据库的写操作,影响了查询的效率,适用于读远大于写的场景.读写分离的实现基础是主从复制,主数据库利用主从复制将自身数据的改变同步到从数据库集群中 ...

  8. 基于mycat的mysql_基于Mycat中间件的MySQL读写分离

    基于Mycat中间件的MySQL读写分离 简述 mycat是国内开源的数据库中间件,可以实现mysql读写分离和主备热切换,容灾,数据分片等功能. 详情:http://www.mycat.io/ 架构 ...

  9. 徐无忌MySQL笔记:案例实战:如何实现MySQL数据库的读写分离?

    徐无忌MySQL笔记:案例实战:如何实现MySQL数据库的读写分离? 完成:第一遍 1.理想的主从架构实现的效果是怎样的? 主库负责所有读写操作,从库只实现对主库备份功能,这样的主从架构性价比是很低的 ...

最新文章

  1. hihoCoder 第136周 优化延迟(二分答案+手写堆)
  2. powerdesigner mysql 反引号_PowerDesigner实用技巧小结 及 导出word,想字段顺序跟模型中一致,如何设置...
  3. 6.6 rsync:文件同步工具
  4. 深度学习——02、深度学习入门 15-18
  5. asp.net core安全事项(上)
  6. mysql启动命令指定data目录_CentOS 7下MySQL的data目录更改后,使用mysqld服务启动失败...
  7. unixbench分析_unixbench测试CPU性能工具
  8. 如何用计算机看苹果手机的文件,如何在电脑上管理iphone文件?
  9. 如何缩减XFS分区格式的根目录
  10. 谁可以参与初创股权分配?
  11. 华尔街日报:郭台铭的“紫禁城”
  12. 文献阅读笔记 # Space/Aerial-Assisted Computing Offloading for IoT Applications: A Learning-Based Approach
  13. mysql的group语句_MySQL中distinct与group by语句的一些比较及用法讲解
  14. SQL Server 2008 R2 RTM 中文版 序列号(转)
  15. java bubble sort_Java-BubbleSort
  16. EXCEL与地图无缝结合,实现地址解析,标注联动更新
  17. 融云 rongyun
  18. Android gif 录屏
  19. 【100个 Unity实用技能】☀️ | Unity中设置 允许的最大帧数,锁定游戏的最大帧率(游戏锁帧)
  20. ORB_SLAM 算法框架解析

热门文章

  1. JSON.parseObject(String str)与JSONObject.parseObject(String str)的区别
  2. 关于链表和指针变量的使用说明,可用于框架设计
  3. JDBC连接sql server数据库及其它
  4. 《无线网络安全攻防实战》读书笔记
  5. 体绘制(Volume Rendering)概述介绍
  6. 网络高可用性解决方案
  7. 深入学习Redis持久化
  8. b2c开发模式的数据库设计
  9. BZOJ4196:[NOI2015]软件包管理器——题解
  10. SpringInAction--自动化装配Bean(显示装配之xml配置)