EntityFramework 实现读写分离

1、数据库切换器

public class RandomGet<T>
        {
            private class RandomModel
            {
                public T Value { get; set; }
                public RandomModel Next { get; set; }
            }
            public RandomGet(params T[] value)
            {
                if (value != null)
                {
                    foreach (var item in value)
                    {
                        AllObject.Add(new RandomModel() { Value = item });
                    }
                }
                if (AllObject.Count > 0)
                {
                    //创建链表
                    AllObject[AllObject.Count - 1].Next = AllObject[0];
                    for (int i = 0; i < AllObject.Count - 1; i++)
                    {
                        AllObject[i].Next = AllObject[i + 1];
                    }
                    Current = AllObject[0];
                }
                else
                {
                    throw new ArgumentException("");
                }
            }
            private List<RandomModel> AllObject { get; set; } = new List<RandomModel>();
            private RandomModel Current;
            public T GetValue()
            {
                Current = Current.Next; //超高的并发,可能短暂的无法切换,但是也会实现数据库的切换
                return Current.Value;
            }

        }

2、EntityFramework拦截器

public class BreakAwayContext : DbContext
        {
            /// <summary>
            /// 命令拦截器
            /// </summary>
            public class NoLockInterceptor : DbCommandInterceptor
            {
                public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
                {
                    command.Connection.Close(); //这里的Close不会大量关闭Connection,因为C#自己的连接池机制,这里不会关闭连接
                    command.Connection.ConnectionString = SelectModel.GetValue();
                    command.Connection.Open();

                }

                public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
                {
                    command.Connection.Close();
                    command.Connection.ConnectionString = SelectModel.GetValue();
                    command.Connection.Open();
                }
            }
            static BreakAwayContext()
            {
                System.Data.Entity.Infrastructure.Interception.DbInterception.Add(new NoLockInterceptor()); //关键代码,设置拦截器
            }
            static RandomGet<String> InsertModel = new RandomGet<String>("Data Source=192.168.0.150;Initial Catalog=MyBook;user id=root;password=123123;");//修改删除的字符串
            static RandomGet<String> SelectModel = new RandomGet<String>(
                "Data Source=192.168.0.150;Initial Catalog=MyBook;user id=root;password=123123;"
                , "Data Source=192.168.0.150;Initial Catalog=MyBook;user id=root;password=123123;"
                , "Data Source=192.168.0.150;Initial Catalog=MyBook;user id=root;password=123123;");//查询的字符串
            public BreakAwayContext()
                : base(InsertModel.GetValue()) //这里每个EF对象创建的时候,调用这个,获得一个连接字符串
            {
            }           

            public DbSet<Destination> Destinations { get; set; }
        }
时间: 2024-12-14 22:50:48

EntityFramework 实现读写分离的相关文章

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

基于 EntityFramework 的数据库主从读写分离服务插件 1.       版本信息和源码 1.1 版本信息 v1.0 beta(2015-04-02),基于 EF 6.1 开发,支持 EF 6.1 之后的所有 EF6 版本. 1.2 开放源码地址 https://github.com/cjw0511/NDF.Infrastructure 关于该 EF 数据库主从读写分离服务核心源码位于文件夹: src\ NDF.Data.EntityFramework\MasterSlaves 文件

基于 EntityFramework 的数据库主从读写分离架构 - 目录

基于 EntityFramework 的数据库主从读写分离架构 回到目录,完整代码请查看(https://github.com/cjw0511/NDF.Infrastructure)中的目录: src\ NDF.Data.EntityFramework\MasterSlaves 基于 EntityFramework 的数据库主从读写分离架构 - 需求/功能概述 基于 EntityFramework 的数据库主从读写分离架构(1)- 原理概述和基本功能实现 基于 EntityFramework 的

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

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

EF6.0新特性-DbCommandInterceptor实现非SQL端读写分离

前几天看了一个基于sqlserver的负载均衡与读写分离的软件Moebius,实现的方式还是不错的,这使得用sqlserver数据库的同学时有机会对数据库进行更有效的优化了 看着人有做的东西,自己也想用EF来实现一个读写分离,所以就有了本篇文章,仓储大叔读写分离的思路是: 1 用sqlserver自带的发布.订阅实现主,从数据库的结构,同步这事由sql帮我们完成 2 配置文件建立几个供只读的数据库连接串 3 建立SQL命令拦截器 4 修改大叔的DbContextRepository基数,添加拦截

EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~再续~添加对各只读服务器的心跳检测

回到目录 上一讲中基本实现了对数据库的读写分离,而在选择只读数据库上只是随机选择,并没有去检测数据库服务器是否有效,如服务器挂了,SQL服务停了,端口被封了等等,而本讲主要对以上功能进行一个实现,并对配置文件也进行了一些优化,让它更好的支持多个数据库服务器,分别配置各个的账号和密码及数据库服务端口等等,接下来,就来看一下主要的代码吧. 一 配置文件 <!-- ef实现对sql读写分离的配置,sqlserver端采用发布与订阅实现 --> <add key="readDb&quo

EF架构~通过EF6的SQL命名拦截器来实现数据库读写分离

回到目录 前几天看了一个基于sqlserver的负载均衡与读写分离的软件Moebius,实现的方式还是不错的,这使得用sqlserver数据库的同学时有机会对数据库进行更有效的优化了 看着人有做的东西,自己也想用EF来实现一个读写分离,所以就有了本篇文章,仓储大叔读写分离的思路是: 1 用sqlserver自带的发布.订阅实现主,从数据库的结构,同步这事由sql帮我们完成 2 配置文件建立几个供只读的数据库连接串 3 建立SQL命令拦截器 4 修改大叔的DbContextRepository基数

EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~终结~配置的优化和事务里读写的统一

回到目录 本讲是通过DbCommand拦截器来实现读写分离的最后一讲,对之前几篇文章做了一个优化,无论是程序可读性还是实用性上都有一个提升,在配置信息这块,去除了字符串方式的拼接,取而代之的是section数组,这样在修改配置时更加清晰了:而实用性上,彻底改变了读和写不能共用一个仓储对象的缺点,并且在一个事务里可以读写并存,并为了数据的一致性,使事务里的curd操作指向主库,这一点很重要! 前几篇文章的目录 EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~再续~添加对各只读服

mysql读写分离的三种实现方式

1 程序修改mysql操作类可以参考PHP实现的Mysql读写分离,阿权开始的本项目,以php程序解决此需求.优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配缺点:自己维护更新,增减服务器在代码处理 2 amoeba参考官网:http://amoeba.meidusa.com/优点:直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案缺点:自己分配账户,和后端数据库权限管理独立,权限处理不够灵活 3 mysql-proxy参考 mysql-proxy

mysql主从复制与读写分离

MySQL主从复制与读写分离 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过.但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面. 因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部