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

///

///SQL命令拦截器///主要实现EF的读写分离///

public classCommandInterceptor : DbCommandInterceptor

{staticCommandInterceptor()

{

readConnList=DistributedReadWriteManager.Instance;

sysTimer.Enabled= true;

sysTimer.Elapsed+=sysTimer_Elapsed;

sysTimer.Start();

}///

///是否在一个事务中,如果是select,insert,update,delete都走主库///ThreadStatic标识它只在当前线程有效///

[ThreadStatic]public static bool IsTransactionScope = false;///

///锁住它///

private static object lockObj = new object();///

///定期找没有在线的数据库服务器///

private static Timer sysTimer = new Timer(5000);///

///读库,从库集群,写库不用设置走默认的EF框架///

private static IListreadConnList;#region Private Methods

private static void sysTimer_Elapsed(objectsender, ElapsedEventArgs e)

{if (readConnList != null &&readConnList.Any())

{foreach (var item inreadConnList)

{//心跳测试,将死掉的服务器IP从列表中移除

var client = newTcpClient();try{

client.Connect(newIPEndPoint(IPAddress.Parse(item.Ip), item.Port));

}catch(SocketException)

{//异常,没有连接上

readConnList.Remove(item);

}if (!client.Connected)

{

readConnList.Remove(item);

}

}

}

}///

///处理读库字符串///

///

private stringGetReadConn()

{if (readConnList != null &&readConnList.Any())

{var resultConn = readConnList[Convert.ToInt32(Math.Floor((double)new Random().Next(0, readConnList.Count)))];return string.Format(System.Configuration.ConfigurationManager.AppSettings["readDbConnection"]

, resultConn.Ip

, resultConn.DbName

, resultConn.UserId

, resultConn.Password);

}return string.Empty;

}///

///只读库的选择,加工command对象///说明:事务中,所有语句都走主库,事务外select走读库,insert,update,delete走主库///希望:一个WEB请求中,读与写的仓储使用一个,不需要在程序中去重新定义///

///

private voidReadDbSelect(DbCommand command)

{if (!string.IsNullOrWhiteSpace(GetReadConn()))//如果配置了读写分离,就去实现

{

command.Connection.Close();if (!command.CommandText.StartsWith("insert", StringComparison.InvariantCultureIgnoreCase) && !IsTransactionScope)

command.Connection.ConnectionString=GetReadConn();

command.Connection.Open();

}

}#endregion

#region Override Methods

///

///Linq to Entity生成的update,delete///

///

///

public override void NonQueryExecuting(DbCommand command, DbCommandInterceptionContextinterceptionContext)

{base.NonQueryExecuting(command, interceptionContext);//update,delete等写操作直接走主库

}///

///执行sql语句,并返回第一行第一列,没有找到返回null,如果数据库中值为null,则返回 DBNull.Value///

///

///

public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContextinterceptionContext)

{

ReadDbSelect(command);base.ScalarExecuting(command, interceptionContext);

}///

///Linq to Entity生成的select,insert///发送到sqlserver之前触发///warning:在select语句中DbCommand.Transaction为null,而ef会为每个insert添加一个DbCommand.Transaction进行包裹///

///

///

public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContextinterceptionContext)

{

ReadDbSelect(command);base.ReaderExecuted(command, interceptionContext);

}///

///发送到sqlserver之后触发///

///

///

public override void ReaderExecuted(DbCommand command, DbCommandInterceptionContextinterceptionContext)

{base.ReaderExecuted(command, interceptionContext);

}#endregion}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543543.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最近的日子,很惬意!

最近的日子,很惬意;没事就去实验室看看编程,最近开始学习JAVA了,上手很快,有了之前面对对象C的基础,java也觉得不是很难,嗯,加油,有实验室一群优秀的人在我身边&#xff…

fastdfs java token_fastdfs 开启 token 防盗链

环境:fastdfsnginx ngx_fastdfs_modulephpfastdfs_php扩展开启token令牌:vi /etc/fdfs/http.conf#开启http.anti_steal.check_tokentrue#密钥http.anti_steal.secret_key123456重启nginxphp中,通过fastdfs_http_gen_token()函数生成$token,例…

objective-C CollectionView 加深(添加注册头部View)

2019独角兽企业重金招聘Python工程师标准>>> #pragma marc 添加Collection -(void)addConllectionView{//collection的布局方案UICollectionViewFlowLayout *collectionViewLayout[[UICollectionViewFlowLayout alloc]init];//设置位置大小以及布局方案_myCollectio…

java如何实现乌龟爬行_请教:一只乌龟的运动

import java.awt.*;import java.awt.event.*;import java.util.EventListener;/*打算你按上,乌龟上爬,按下,乌龟下爬。但是一直没有repaint,怎么回事呀,请教下什么地方错了,怎么才能动。*/public class WuG…

Javascript中Base64编码解码的使用实例

Javascript为我们提供了一个简单的方法来实现字符串的Base64编码和解码,分别是window.btoa()函数和window.atob()函数。 1 var encodedStr window.btoa(“Hello world”); //字符串编码 2 var decodedStr window.atob(encodedStr); //字符串解码看下面的实例代…

java中创建窗口用的什么_JAVA 窗口的创建

奇了个怪了,没什么大问题。你在cmd里编译试试实在不行,加我QQ:656098987,帮你远程看看代码可以试试这么写import java.awt.Color;import java.awt.Image;import java.awt.Toolkit;import javax.swing.ImageIcon;import javax.swing.JFrame;im…

mysql安装前的系统准备工作(转)

一、系统环境总结: 二、安装yum源: 1、安装磁盘yum源: 一、安装xfs文件系统:1、配置yum源:(光盘)vi /etc/yum.repos.d/yum.repo[Server]nameserverbaseurlfile:///tmp/cddir/Server/enabled1gpg…

怎样与用户有效的沟通以获取用户的真实需求

访谈人员必须要站在用户的角度去与用户进行交谈,同时,在与用户交谈前,先要了解用户可能使用到的专业领域的专有名词,防止在交谈过程中用户的意思,导致双方所交谈的内容词不达意。在与用户的沟通中,软件开发…

layui常用的表单标签_Layui常用组件:表格(table)

快速使用添加删除编辑查看编辑删除layui.use([table], function () {table.render({elem: #demo,url: url//表格数据接口,toolbar: #toolbarDemo //开启头部工具栏,并为其绑定左侧模板,page:true//开启分页,loading:true//显示加载条,cols: [[{type: checkbox, fixe…

快递100推送服务

快递查询服务能做到这个程度,真是牛掰到极点了。 尊敬的快递100客户: 快递100推送服务已增加QQ推送功能,请尽快让贵司的技术人员升级您的程序: 请在订阅报文中增加以下字段和值,我们会免费会向贵司的买家的QQ号推送物流…

java代码中何处以main开始_自测题: Java 基础

1.19 自测题:什么是字节码?它对Java的Internet程序设计为何十分重要?字节码是一种高度优化的指令集,由Java虚拟机执行,可帮助Java获得可移植性和安全性面向对象程序设计的三个主要原则是什么?封装、多态性和继承Java程…

理解HTTP幂等性

2019独角兽企业重金招聘Python工程师标准>>> 理解HTTP幂等性 基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API。为什么Web API如此流行呢&#xff…

控件UI性能调优 -- SizeChanged不是万能的

简介 我们在之前的“UWP控件开发——用NuGet包装自己的控件“一文中曾提到XAML的布局系统 和平时使用上的一些问题(重写Measure/Arrange还是使用SizeChanged?),这篇博文就来为大家简单地描述一下XAML布局系统的行为,并…

java框架异常怎么处理_java异常处理与处理框架-笔记

1、Java异常分为checked异常和unchecked异常checked异常(需要在代码中try……catch显示捕获)所有继承java.lang.Exception的异常。是可以在执行过程中恢复的。此类异常不是程序中可以预测的,比如无效的用户输入、文件不存在等。这些都是外在的原因,都不是…

自动化安装

自动化安装 流程设计 Cobbler ###########################物理机自动安装的流程############################### 1.采购--》验货--》签字,验货单,盖公章 2.资产管理:资产录入--》机房 区域 排 机柜 位置 配置 (资产管理&#…

mysql什么情况会刷脏页_mysql-刷脏页(12)

一,mysql因为WAL机制,在更新时,首先会更新内存,再写redo log。一般情况下是在空闲时,将redo log刷新到磁盘中。二,什么是脏页。当内存中与磁盘中的数据不一致时,内存中的数据页就称为脏页。(也可…

android 跨进程多实例播放demo

2019独角兽企业重金招聘Python工程师标准>>> 客户端进程需要实现,其中notify方法需要service 跨进程调用,通知客户端播放消息 IMediaPlayerClient.aidl package com.example.demo; import com.example.demo.ParcelableParcel; interface IM…

java npm install_npm install不构建供应商可执行文件

TL; DR:为什么npm不构建依赖项的二进制可执行文件,如何在没有显式构建它们的情况下构建它们?我的项目在常规的package.json中描述了它的依赖项 . 当我运行 npm install 时,所有软件包都按预期安装在node_modules中 . 但是&#xf…

JDBC第三次学习

这是我的JDBC第三次学习了,在学习的过程中,老是会忘掉一些知识,不记下笔记实在不行啊! 使用JDBC调用存储过程 (1)关于如何使用Navicat(11.1.13) for MySQL如何创建存储过程。我在另一篇文章写过,在此不赘述了。 使用Na…

java 获取service_Java service层获取HttpServletRequest工具类的方法

Java service层获取HttpServletRequest工具类的方法大家都知道 能在Controller/action层获取HttpServletRequest,但是这里给大家备份的是从代码内部service层获取HttpServletRequest工具类。具体如下:package com.base.common.sessionutils;import javax…