博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离
阅读量:6243 次
发布时间:2019-06-22

本文共 2921 字,大约阅读时间需要 9 分钟。

前几天看了一个基于sqlserver的负载均衡与读写分离的软件Moebius,实现的方式还是不错的,这使得用sqlserver数据库的同学时有机会对数据库进行更有效的优化了

看着人有做的东西,自己也想用EF来实现一个读写分离,所以就有了本篇文章,仓储大叔读写分离的思路是:

1  用sqlserver自带的发布、订阅实现主,从数据库的结构,同步这事由sql帮我们完成

2  配置文件建立几个供只读的数据库连接串

3  建立SQL命令拦截器

4  修改大叔的DbContextRepository基数,添加拦截行为

5  测试,搞定

有了上面的想法,咱就可以干事了,第一步不用说了,可以自己百度,从第2步说起

2  配置文件建立几个供只读的数据库连接串

3  建立SQL命令拦截器

///     /// SQL命令拦截器    ///     public class NoLockInterceptor : DbCommandInterceptor    {        private static readonly Regex _tableAliasRegex =            new Regex(@"(?
AS \[Extent\d+\](?! WITH \(NOLOCK\)))", RegexOptions.Multiline | RegexOptions.IgnoreCase); [ThreadStatic] public static bool SuppressNoLock; public override void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext
interceptionContext) { string conn = command.Connection.ConnectionString; base.NonQueryExecuting(command, interceptionContext); } public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContext
interceptionContext) { command.Connection.Close(); command.Connection.ConnectionString = "data source=.;initial catalog=background_Read1;persist security info=True;user id=sa;password=zzl123;multipleactiveresultsets=True;application name=EntityFramework"; command.Connection.Open(); if (!SuppressNoLock) { command.CommandText = _tableAliasRegex.Replace(command.CommandText, "${tableAlias} WITH (NOLOCK)"); } } public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext
interceptionContext) { command.Connection.Close(); command.Connection.ConnectionString = "data source=.;initial catalog=background_Read1;persist security info=True;user id=sa;password=zzl123;multipleactiveresultsets=True;application name=EntityFramework"; command.Connection.Open(); if (!SuppressNoLock) { command.CommandText = _tableAliasRegex.Replace(command.CommandText, "${tableAlias} WITH (NOLOCK)"); } } }

4  修改大叔的DbContextRepository基数,添加拦截行为

public DbContextRepository(IUnitOfWork db, Action
logger) { UnitWork = db; Db = (DbContext)db; Logger = logger; ((IObjectContextAdapter)Db).ObjectContext.CommandTimeout = 0; //SQL语句拦截器 System.Data.Entity.Infrastructure.Interception.DbInterception.Add(new EntityFrameworks.Data.Core.Common.NoLockInterceptor()); EntityFrameworks.Data.Core.Common.NoLockInterceptor.SuppressNoLock = true; }

5  大功造成,感谢阅读!

本文章代码没有全部展示,只是展示一种思想,希望可以给大家带来帮助。

 

转载于:https://www.cnblogs.com/lori/p/4208974.html

你可能感兴趣的文章
小小不爽一下
查看>>
【转】NuGet学习笔记(1)——初识NuGet及快速安装使用
查看>>
Python学习笔记 - MySql的使用
查看>>
WebApi FormData+文件长传 异步+同步实现
查看>>
Linux文件与目录管理
查看>>
多态的弊端
查看>>
Spring @Import 注解
查看>>
PBOC APDU命令解析【转】
查看>>
封装HttpUrlConnection开箱即用
查看>>
第二天笔记
查看>>
如何在外部终止一个pengding状态的promise对象
查看>>
初级模拟电路:1-5 二极管的其他特性
查看>>
《简明Python教程》Swaroop, C. H. 著 第1章 介绍
查看>>
Chapter 4. Working with Key/Value Pairs
查看>>
Python基础:Python可变对象和不可变对象
查看>>
[css3]文字过多以省略号显示
查看>>
vim显示行号、语法高亮、自动缩进的设置
查看>>
shell中的if语句
查看>>
WCf客户端测试
查看>>
Java线程面试题 Top 50
查看>>