基于 EntityFramework 的数据库主从读写分离服务插件

1. 版本信息和源码

1.1版本信息

v1.01 beta(2015-04-07),基于 EF 6.1 开发,支持 EF 6.1 之后的所有 EF6 版本。

1.2开放源码地址

关于该 EF 数据库主从读写分离服务核心源码位于文件夹:src\ NDF.Data.EntityFramework\MasterSlaves 文件夹中。

2. 功能概述

2.1支持在基于 EF6 进行数据操作时:

2.1.1   针对所有的数据写入操作,自动将请求转发至 主服务器(Master,即写入操作服务器);

2.1.2   针对所有的数据查询操作,自动将请求转发至 从服务器(Slave ,即查询操作服务器);

2.1.3   以上的数据库操作请求转发通过在执行命令前更改数据库连接字符串来完成,但是该数据连接字符串的更改动作,不需要业务开发人员改动任何现有代码;

2.2在将读写命令请求转发至相应数据库服务器时,支持一主多从管理

即可以设定一台数据库服务器作为 Master 服务器,同时可以设置一台或者多台数据库服务器作为 Slave 服务器;

注:Master 服务器和 Slave 服务器之间的需提前建立数据同步机制,该部分工作可通过配置 DBMS 系统来完成。

2.3支持自动检测服务器运行状态:

2.3.1   可自动检测 Master 服务器的在线状态;

2.3.2   可自动检测设定的 Slave 服务器列表中每台 Slave 服务器节点的在线状态;

2.3.3   可自定义设定自动检测服务器状态的时间频率;

2.4支持在 Slave 服务器节点不可用时自动切换至 Master 节点:

如果设置了多台 Slave 服务器节点,将在每次执行查询操作时,根据自动检测的 Slave 服务器在线状态自动选择可用的服务器节点;如果所有的 Slave 都不可用,则可以根据配置确定是否自动将数据查询操作切换至 Master 服务器;

2.5支持在 Master 服务器节点不可用时自动切换至 Slave 节点:

在基于 EF6 的数据更改操作时,如果检测到 Master 服务器状态不可用,则可以根据配置确定是否自动将数据更改操作切换至 Slave 服务器列表中的第一个可用项(一般情况下不建议进行该设定,因为将 Slave 服务器作为 Master 服务器使用虽然能使在 Master 故障后应用程序不离线,但是同样也会带来在 Slave 服务器节点之间的数据一致性问题。);

2.6支持多台 Slave 节点之间的负载均衡:

如果设定了多台 Slave 服务器节点,在每次执行查询操作时,支持按照设定顺序选择第一台可用的 Slave 服务器,也支持随机选择所有可用的 Slave 服务器中任意一台(该设置可以有效分散 Slave 服务器查询压力)以执行查询命令。

2.7 支持面向切面的 EF 数据库主从读写分离服务动作拦截器配置:

可通过定义和注册实现接口 IMasterSlaveInterceptor 的拦截器,以实现在 EF 数据库主从读写分离服务执行特定动作:

扫描服务器节点可用状态前、扫描服务器节点可用状态后、修改数据库操作命令的连接字符串前、修改数据库操作命令的连接字符串后时以执行用户指定的附加动作(例如在扫描到服务器节点不可用时自动记录日志或发送消息通知)。

2.8支持 EF 中的多 DbContext 类型配置:

如果项目中使用多种类型的  EF 实体上下文(System.Data.Entity.DbContext) 对象,支持为每个不同类型的 DbContext 分别配置不同的主从读写分离数据库连接方案;

2.9支持 Master 服务器节点和 Slave 服务器节点的热插拔配置:

即可以不用停止项目的运行,直接通过修改配置文件 ef.masterslave.config 中的内容,来达到自动刷新相关配置连接的效果;在修改配置文件后并重新生效时,支持自定义的更改事件通知。

3. 使用说明

3.1设置多个数据库服务器实例之间的自动同步

首选通过数据库管理系统(DBMS)来配置多个数据库服务器实例之间的主从自动同步机制,例如:

3.1.1   如果是用 MSSQLSERVER 数据库系统,可以配置多台数据库服务器实例之间的复制、订阅策略;

3.1.2   如果是用 MySQL 数据库系统,可以配置多台数据库服务器实例之间的主从复制策略;

3.1.3   其他 Oracle、DB2...

3.2在项目中添加配置文件

在项目根目录下添加配置文件 ef.masterslave.config,并按规则修改其中的内容,以下是一份参考的配置方式:

1 <?xml version="1.0" encoding="utf-8"?>

2

3

4

5

6

7

8

9 requirePermission="false" />

10

11

12

13

14

15

16

17

18

19 autoSwitchSlaveOnMasterFauled="false"autoSwitchMasterOnSlavesFauled="true"

20

21 serverStateScanInterval="60"serverStateScanWithNoOffline="false"

22

23 slaveRandomization="true" >

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

54

55

56

57

3.3在项目中引入依赖的程序包

3.3.1   EntityFramework 6.1 以上版本;

3.3.2   Microsoft Enterprise Library - Data Access Application Block 6;

3.3.3   Newtonsoft.Json.dll 6.0 以上版本;

3.3.4   NDF.Utilities.dll;

3.3.5   NDF.Data.dll;

3.3.6   NDF.Data.EntityFramework.dll;

3.4在项目中添加启动代码

在项目的启动代码中(控制台和桌面程序一般为 Program 类型的 Main 方法、ASP.NET 程序一般为 Global.asax 文件的 Application_Start 代码块)加入如下代码段:

1 NDF.Data.EntityFramework.MasterSlaves.EFMasterSlaveConfig.Register(typeof(MyDbContext));

其中方法中传入的类型参数应该是 ef.masterslave.config 配置文件中 applyItem 节的 targetContext 属性所示的类型,表示要为具体哪个类型的 EF 实体上下文(DbContext) 配置读写分离服务。

4. 其他

4.1  关于主从数据库中相关数据内容的自动同步机制,由数据库管理系统(DBMS,如 MSSQLSERVER、Oracle、MySQL、DB2 等)来完成,该部分的功能不由本插件来提供;目前几乎所有的主流 DBMS 系统都提供了主从数据库自动同步机制相关功能;

4.2  该 EF 数据库主从读写分离方案支持所有普通数据库事务和分布式事务操作,不过分布式事务也同样需要数据库管理系统(DBMS)的支持否则无效;

4.3  在基于 EF6 和该插件的配合进行数据库主从读写分离操作,程序会自动检测所执行的数据库操作的事务状态,并自动将带有数据库事务或分布式事务的所有 增删改请求 和 查询请求 都转发至 Master 服务器。

4.4  本篇文章只是概述性的介绍了本人编写的这个 EF 数据库主从读写分离插件,关于该插件的源码实现原理和思路,本人将会在以后的博文中展开介绍。

ef mysql 读写分离_基于 EntityFramework 的数据库主从读写分离服务插件相关推荐

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

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

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

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

  3. 路由器snmp配置_基于keepalived配置数据库主从实现高可用

    基于keepalived配置数据库主从实现高可用 使用keepalived来监听端口,实现数据库的高可用.实现效果,其中一台数据库服务器突然出故障或关机时,应该不影响应用正常运行,等待服务器启动之后, ...

  4. mysql实体监听器_使用remote_listener实现数据库与监听器分离 | HelloDML

    remote_listener一般用在RAC环境中,单实例数据库是否可以使用该参数呢?如果可以,是否可以让listener 和数据库放在不同主机上?下面我们构造一个环境来测试下:环境:数据库在192. ...

  5. sqlserver date类型和字符串比较_基于SQL Server数据库搭建主从复制实现读写分离实战演练...

    一.课程介绍 读写分离(主从同步)从字面意思就可以理解,就是把对数据库的读操作和写操作分离开.读写分离在网站发展初期可以一定程度上缓解读写并发时产生锁的问题,将读写压力分担到多台服务器上.读写分离的基 ...

  6. solidworks批量图号分离_SolidWorks2014基于宏实现快速图号名称分离.docx

    SolidWorks2014基于宏实现快速图号名称分离 SolidWorks2014基于宏实现快速"图号名称"分离 当我们创建好一个Solidworks 零件以后,为了更快速把零件 ...

  7. springboot jwt token前后端分离_基于Spring Boot+Spring Security+JWT+Vue前后端分离的开源项目...

    一.前言 最近整合Spring Boot+Spring Security+JWT+Vue 完成了一套前后端分离的基础项目,这里把它开源出来分享给有需要的小伙伴们 功能很简单,单点登录,前后端动态权限配 ...

  8. mysql for循环_基于Swoole扩展开发异步高性能的MySQL代理服务器

    MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...

  9. mysql异步扩展_基于Swoole扩展开发异步高性能的MySQL代理服务器

    MySQL数据库对每个客户端连接都会分配一个线程,所以连接非常宝贵.开发一个异步的MySQL代理服务器,PHP应用服务器可以长连接到这台Server,既减轻MYSQL的连接压力,又使PHP保持长连接减 ...

最新文章

  1. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第6章-区域极点配置
  2. 巨杉数据库 CTO 王涛:区块链+数据库,底层技术融合是否带来更大爆发?
  3. python ioc di_PHP的依赖注入(DI) 和 控制反转(IoC)
  4. Petuum - Careers
  5. 你不可错过的Java学习资源清单
  6. 雨听 | 英语学习笔记(三)~作文范文:90后的网络生活
  7. 推荐一个不错的国外html5模板网站
  8. 舌尖上的中国第二季整理笔记
  9. MySQL中的排序与分页
  10. 史上最全的边缘计算应用场景
  11. 江西省一级计算机考试试题,江西省历年计算机一级考试试题
  12. 最长回文 HDU - 3068 马拉车算法
  13. 小红书投放效果差?3招教你优化Brief直击用户需求
  14. 使用cucumber ,想把一个完整的流程,写成一个可执行的自动化测试脚本,应该如何划分 Scenario
  15. 全民一起VBA提高篇 第二十八回 任凭字符串千变万化,难逃正则式一定之规
  16. 微信小程序连接oracle数据库,【微信小程序】关于微信小程序中跳转传参数与传对象的解析...
  17. java基础语法要学多久
  18. 【重磅】中信建投与米筐科技达成战略级合作
  19. 中兴手机android版本升级包下载,刷机
  20. 【CF337D】邪恶古籍-树状dp

热门文章

  1. 5大主流主链排行版出炉; 以太坊新生合约数持续3周下跌; 各大榜单均现“黑马”冲榜!| 数据周榜...
  2. 软件正在吞噬世界!如何拯救旧金山的开发者?
  3. 千亿智慧照明市场背后,BLEMESH免开发方案成主流
  4. 马化腾评 Facebook 加密货币;苹果或将 15% 产能移出中国;Python 新版发布 | 极客头条...
  5. WWDC 2019 大会前瞻:暗黑模式来袭、iOS 与 macOS 互通?
  6. @程序员 腾讯云计算机视觉应用干货,不容错过!
  7. 张小龙「跳一跳」都玩到 6000 多分,是时候掌握微信小游戏高级开发了
  8. 010.第一个回声服务器可能遇到的问题——connect函数
  9. String源码分析,中高级Java开发面试题
  10. 字节跳动最新开源!java条件运算符判断三个数大小