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

本文介绍了使用EF6实现数据库读写分离的方法,并通过DbCommand拦截器添加了对各只读服务器的心跳检测功能,确保读操作能稳定地分配到有效的数据库服务器。

上一讲中基本实现了对数据库的读写分离,而在选择只读数据库上只是随机选择,并没有去检测数据库服务器是否有效,如服务器挂了,SQL服务停了,端口被封了等等,而本讲主要对以上功能进行一个实现,并对配置文件也进行了一些优化,让它更好的支持多个数据库服务器,分别配置各个的账号和密码及数据库服务端口等等,接下来,就来看一下主要的代码吧。

一 配置文件

    <!-- ef实现对sql读写分离的配置,sqlserver端采用发布与订阅实现 -->
    <add key="readDb" value="
         192.168.2.71|1433|background_read1|sa|zzl123,
         192.168.2.71|1433|TestWrite_Read_Zzl|sa|zzl123,
         192.168.2.29|1433|TestWrite_Read_Zzl|sa|1"
         />
    <!-- 只读服务器的sql连接串配置模版-->
    <add key ="readDbConnectioin" value="data source={0};initial catalog={1};persist security info=True;user id={2};password={3};multipleactiveresultsets=True;application name=EntityFramework"/>

二 数据库配置实体类

 /// <summary>
    /// 只读数据库配置实体
    /// </summary>
    public class ReadDbConfig
    {
        public ReadDbConfig()
        {
            Port = 1433;
            UserId = "sa";
        }
        public string Ip { get; set; }
        public int Port { get; set; }
        public string DbName { get; set; }
        public string UserId { get; set; }
        public string Password { get; set; }
    }

三 对SQL拦截器进行优化,添加了TCP的心跳检测

lock (lockObj)
            {
                if (readConnList != null && readConnList.Any())
                {
                    foreach (var item in readConnList)
                    {
                        //心跳测试,将死掉的服务器IP从列表中移除
                        var client = new TcpClient();
                        try
                        {
                            client.Connect(new IPEndPoint(IPAddress.Parse(item.Ip), item.Port));
                        }
                        catch (SocketException)
                        {
                            //异常,没有连接上
                            readConnList.Remove(item);
                        }
                        if (!client.Connected)
                        {
                            readConnList.Remove(item);
                        }
                    }
                }
            }

四 对于数据库库端还是这前通过发布和订阅实现的,需要注意的是,这些功能需要使用“机器名”进行链接,使用ip和域名都是无效的

五 下面贡献一下完成的拦截器代码

  View Code

本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~再续~添加对各只读服务器的心跳检测,如需转载请自行联系原博主。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值