EF6.0新特性-DbCommandInterceptor实现非SQL端读写分离
前几天看了一个基于sqlserver的负载均衡与读写分离的软件Moebius,实现的方式还是不错的,这使得用sqlserver数据库的同学时有机会对数据库进行更有效的优化了
aaarticlea/png;base64,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" alt="" />
看着人有做的东西,自己也想用EF来实现一个读写分离,所以就有了本篇文章,仓储大叔读写分离的思路是:
1 用sqlserver自带的发布、订阅实现主,从数据库的结构,同步这事由sql帮我们完成
2 配置文件建立几个供只读的数据库连接串
3 建立SQL命令拦截器
4 修改大叔的DbContextRepository基数,添加拦截行为
5 测试,搞定
有了上面的想法,咱就可以干事了,第一步不用说了,可以自己百度,从第2步说起
配置文件建立几个供只读的数据库连接串
<!-- 只写-->
<add name="backgroundEntities" connectionString="metadata=res://*/background.csdl|res://*/background.ssdl|res://*/background.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=background;persist security info=True;user id=sa;password=zzl123;multipleactiveresultsets=True;application name=EntityFramework"" providerName="System.Data.EntityClient" />
<!-- 只读-->
<add name="backgroundEntitiesRead" connectionString="metadata=res://*/background.csdl|res://*/background.ssdl|res://*/background.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=background_Read1;persist security info=True;user id=sa;password=zzl123;multipleactiveresultsets=True;application name=EntityFramework"" providerName="System.Data.EntityClient" />
建立SQL命令拦截器
/// <summary>
/// SQL命令拦截器
/// </summary>
public class NoLockInterceptor : DbCommandInterceptor
{
private static readonly Regex _tableAliasRegex =
new Regex(@"(?<tableAlias>AS \[Extent\d+\](?! WITH \(NOLOCK\)))",
RegexOptions.Multiline | RegexOptions.IgnoreCase); [ThreadStatic]
public static bool SuppressNoLock;
public override void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
string conn = command.Connection.ConnectionString;
base.NonQueryExecuting(command, interceptionContext);
}
public override void ScalarExecuting(DbCommand command,
DbCommandInterceptionContext<object> 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<DbDataReader> 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)");
}
}
}
修改大叔的DbContextRepository基数,添加拦截行为
public DbContextRepository(IUnitOfWork db, Action<string> 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;
}
大功造成,感谢阅读!
原文链接1:
EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离
原文链接2:
基于 EntityFramework 的数据库主从读写分离服务插件
EF6.0新特性-DbCommandInterceptor实现非SQL端读写分离的更多相关文章
- C# 9.0 新特性之参数非空检查简化
阅读本文大概需要 1.5 分钟. 参数非空检查是缩写类库很常见的操作,在一个方法中要求参数不能为空,否则抛出相应的异常.比如: public static string HashPassword(st ...
- Spring Boot 2(一):Spring Boot 2.0新特性
Spring Boot 2(一):Spring Boot 2.0新特性 Spring Boot依赖于Spring,而Spring Cloud又依赖于Spring Boot,因此Spring Boot2 ...
- Mysql 8.0 新特性测试
Mysql 8.0 新特性测试 Role MySQL8.0版本添加了role特性,role是一种逻辑概念是权限的集合,可以将一个或以上的权限赋予给role,再将role赋给user.Oracle,Po ...
- 【mysql】mysq8.0新特性
一.MySQL8.0简介 mysql8.0现在已经发布,2016-09-12第一个DM(development milestone)版本8.0.0发布.新的版本带来很多新功能和新特性,对性能也得到 ...
- MySQL 8.0 新特性梳理汇总
一 历史版本发布回顾 从上图可以看出,基本遵循 5+3+3 模式 5---GA发布后,5年 就停止通用常规的更新了(功能不再更新了): 3---企业版的,+3年功能不再更新了: 3 ---完全停止更新 ...
- 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?
来源:微信公众号CodeL 今天给大家分享的内容基于前几天收到的一条留言信息,留言内容是这样的: 看了这位网友的留言相信有不少刚接触开发的童鞋们也会有同样的困惑,除了用新建类作为桥梁之外还有什么好的办 ...
- C# 7.0 新特性3: 模式匹配
本文参考Roslyn项目Issue:#206,及Docs:#patterns. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# ...
- C# 7.0 新特性4: 返回引用
本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- [转]Servlet 3.0 新特性详解
原文地址:http://blog.csdn.net/xiazdong/article/details/7208316 Servlet 3.0 新特性概览 1.Servlet.Filter.Listen ...
随机推荐
- Win7关机时弹出对话框,提示你想要的信息
博主换了个公司,要求每天写日志,次日8点前没写的话就要扣钱,1篇10块钱,博主已经两次写完忘记提交到ERP系统了,捂脸... 因为公司要求所有工作在公司配的台式电脑上,所以如果能在关机前弹个提示(不关 ...
- 原型模式(ProtoType)
用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象. 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节. .Net 在 system 命名空间中提供了I ...
- mac mysql中文乱码问题
God,今天看了好多资料,除了让我命令更熟练以外浪费了好多时间. 遇到的问题:写入数据库有中文的时候,显示??? 最后解决办法: 1.打开终端,输入: mysql -u root -p,然后输入mys ...
- nslookup域名解析
域名解析 nslookup docker.xxx.com.cn
- js改变div高度
用bootsrap响应式布局的时候,遇到个很恶心的问题:左边栏很短很难看!! 于是,想用js来自动改变左边的高度,没成功!!原来是设置的时候,没加单位,坑爹了. 参考:http://blog.sina ...
- Java中3种代理总结(示例代码见之前文章)
1.JDK静态代理 业务接口 接口的实现类 代理类,实现接口,并扩展实现类的功能 ### 2.JDK动态代理 业务接口 实现了业务接口的业务类 实现了InvocationHandler接口的handl ...
- ABAP-金额小写转大写
FUNCTION ZSDI0007_CH_LOWERTOUPPER. *"---------------------------------------------------------- ...
- CVE2016-8863libupnp缓冲区溢出漏洞原理分析及Poc
1.libupnp问题分析: (1)问题简述: 根据客户给出的报告,通过设备安装的libupnp软件版本来判断,存在缓冲区溢出漏洞:CVE-2016-8863. (2)漏洞原理分析: 该漏洞发生在up ...
- C++ 0x 使用可变参数模板类 实现 C# 的委托机制
#ifndef _ZTC_DELEGATE_H_ #define _ZTC_DELEGATE_H_ #include <vector> #include <functional> ...
- DELPHI WM_CopyData 用法
unit Unit1; interface usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...