`

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

 
阅读更多

1. 版本信息和源码

1.1 版本信息

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

 

1.2 开放源码地址

https://github.com/cjw0511/NDF.Infrastructure

关于该 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,并按规则修改其中的内容,以下是一份参考的配置方式:

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

        <configuration>

          <configSections>

            <section name="ef.masterslave" type="NDF.Data.EntityFramework.MasterSlaves.ConfigFile.EFMasterSlaveSection, NDF.Data.EntityFramework"

                     requirePermission="false" />

          </configSections>

          <ef.masterslave>

            <!-- 以下是为所有用 EF 实体上下文(DbContext)类型为 MyProject.Data.MyDbContext 的数据库操作配置主从读写分离服务  -->

            <applyItem targetContext="MyProject.Data.MyDbContext, MyProject.Data"

                       autoSwitchSlaveOnMasterFauled="false" autoSwitchMasterOnSlavesFauled="true"

                       serverStateScanInterval="60" serverStateScanWithNoOffline="false"

                       slaveRandomization="true" >

              <master connectionString="server=192.168.0.99;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" />

              <slaves>

                <add connectionString="server=192.168.0.101;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" order="0" />

                <add connectionString="server=192.168.0.102;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" order="1" />

                <add connectionString="server=192.168.0.103;port=3306;user id=root;password=123456;persistsecurityinfo=True;database=testdb;convertzerodatetime=True;allowzerodatetime=True" order="2" />

              </slaves>

            </applyItem>

            <!-- 以下是为另一个 EF 实体上下文(DbContext)配置主从读写分离服务  -->

            <!--<applyItem ...>

              <master ... />

              <slaves>

                <add ... />

                <add ... />

              </slaves>

            </applyItem>-->

          </ef.masterslave>

        </configuration>

 

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 代码块)加入如下代码段:

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 数据库主从读写分离插件,关于该插件的源码实现原理和思路,本人将会在以后的博文中展开介绍。

分享到:
评论

相关推荐

    Entity Framework主从表使用

    Entity Framework(EF)是Microsoft开发的一个对象关系映射(ORM)框架,用于.NET应用程序,它允许开发者使用面向对象的编程语言来操作数据库,无需关注底层的SQL语句。在数据库领域,主从表是一个常见的概念,主表...

    数据库读写分离demo.rar

    在Entity Framework Core中,可以通过自定义DbContext或使用第三方库(如MySql.Data.EntityFrameworkCore等,它们通常内置了读写分离的支持)来实现。在应用层,根据操作类型选择连接到主库还是从库,例如,使用`...

    如何使用C#中EntityFrameworkCore读写Mysql数据库.zip

    如何使用C#中EntityFrameworkCore读写Mysql数据库 https://blog.csdn.net/gs1069405343/article/details/114211697

    Programming Entity Framework DbContext

    在本篇详细知识点讲解中,将基于给定文件信息,深入探讨Entity Framework(实体框架)中Code First方法的相关知识点。根据文件标题《Programming Entity Framework DbContext》和描述,该文件应该是关于Entity ...

    Entity Framework官方中文教程

    Entity Framework(EF)是微软提供的一个对象关系映射(O/RM)框架,它简化了.NET开发人员访问数据库的代码编写,无需手动编写大量数据访问代码。EF允许开发者通过.NET对象模型来操作数据库。Entity Framework Core...

    Entity Framework创建数据库

    首先介绍一下Entity Framework(个人使用的方式,我没有深入研究),Entity Framework后面简称EF,EF对象关系解决方案,让程序设计者专心于程序设计,不用花时间去研究SQL语句。那么EF是怎么创建数据库,怎么和数据库...

    EntityFramework.SqlServer_EntityFramework_

    标题中的`EntityFramework.SqlServer_EntityFramework_`可能是指这个项目或库是关于Entity Framework与SQL Server数据库交互的一个部分,可能是对原生EF的增强或者封装,目的是为了简化和优化SQL Server的数据操作。...

    Entity Framework 4.0 and Web Forms

    总的来说,这本书为开发者提供了一个使用Entity Framework 4.0和*** Web Forms创建Web应用程序的完整教程,从创建Web应用程序和数据库开始,到使用Entity Framework数据模型和EntityDataSource控件来实现数据的显示...

    SQLite数据库创建EntityFramework数据模型支持程序

    SQLite数据库创建Entity Framework数据模型支持程序是一个用于Visual Studio 2010的工具,它使得开发者能够更加便捷地在SQLite数据库上构建数据模型。Entity Framework是Microsoft推出的一个面向对象的ORM(对象关系...

    使用EntityFramework操作SQLite数据库的记录日记的小项目

    EntityFramework是中国墙外微软开发的一款强大的对象关系映射(ORM)框架,它允许开发者使用.NET语言(如C#或VB.NET)与数据库进行交互,而无需编写SQL语句。在这个小项目中,我们看到它是与SQLite数据库配合使用的...

    WCF+Silverlight+EntityFramework+Sqlite所做的学生管理系统

    WCF+Silverlight+EntityFramework+Sqlite所做的学生信息管理系统,自己闲暇时间做着玩的,页面什么的比较丑,不过不要在意那些细节……数据库采用Sqlite,非常小的一个数据库,我就不提供了,网上一大堆,表结构什么...

    Entity Framework 4 In Action

    ### Entity Framework 4 In Action:全面解析与应用实践 #### 一、书籍概述与背景介绍 《Entity Framework 4 In Action》是一本深入探讨Entity Framework 4(简称EF4)的权威指南,由Stefano Mostarda、Marco De ...

    entityframework.dll

    EntityFramework.dll是微软开发的一个对象关系映射(ORM)框架,它是.NET Framework的重要组成部分,用于简化数据库操作。ORM允许开发者使用面向对象的编程语言(如C#或VB.NET)来处理数据库,而无需直接编写SQL语句...

    【generaldata.entityframeworkcore.gbase包】.net操作GBase数据库必备NuGe程序包

    .net操作GBase数据库时,可以通过GbsConnection类实现,此类库需要安装NuGet包【generaldata.entityframeworkcore.gbase包】,但是微软默认NuGet中没有集成该包,需要手动安装。 1、下载包generaldata.entity...

    Entity Framework 6 Recipes

    Entity Framework 6 Recipes Entity Framework 6 Recipes

    Z.EntityFramework.Extensions注册机

    Z.EntityFramework.Extensions的批量添加功能允许开发者将一组新的实体对象添加到数据库,而不是一个接一个地添加,从而减少数据库交互次数,提高了整体的插入速度。 批量删除则解决了删除大量记录时的问题。通常,...

    entity framework 三层实例

    Entity Framework 是微软开发的一款强大的对象关系映射(ORM)框架,它允许开发者使用.NET语言(如C#或VB.NET)来操作数据库,而无需编写大量的SQL语句。在本实例中,我们将探讨如何在ASP.NET 3.5环境中利用Entity ...

    Entity Framework 使用详解doc

    Entity Framework 是一个基于 ADO.NET 的对象关系映射(Object-Relational Mapping)框架,用于将 .NET 应用程序连接到关系数据库。Entity Framework 提供了一个模型驱动的设计方法,用于定义应用程序的数据模型,...

    EntityFramework.Extended支持MySql数据库

    描述中提到的"自己改的支持Mysql的",意味着有开发者或社区成员已经对原版的EntityFramework.Extended进行了修改,使其能够适配MySQL数据库,这通常涉及到对内部代码的调整,以匹配MySQL的特定语法和功能。...

    基于.NET Entity Framework数据库访问机制的设计与应用 (2014年)

    基于Entity Framework框架设计一个典型MVC架构中的数据库访问层,运用Entity Framework框架中的Code First方式结合泛型、封装、单例模式等技术,实现实体类映射到数据库表并自动往数据库建表的功能,并对每个实体类...

Global site tag (gtag.js) - Google Analytics