繁体   English   中英

如何实施Exchange,例如内部SQL Server的可用性监视

[英]How to Implement Exchange like availability monitoring of internal SQL Server

我们有一个内部应用程序( 胖客户端 ),它依赖我们的中央SQL Server。 该应用程序是一个桌面应用程序,允许用户在“脱机”模式下工作(例如Outlook)。 我需要完成的是一种准确判断SQL是否可用的方法。

到目前为止,我有:

我目前使用以下方法->

 internal static void CheckSQLAvailability()
    {
        using (TcpClient tcpc = new TcpClient())
        {
            try
            {
                tcpc.Connect(Settings.Default.LiveSQLServer, Settings.Default.LiveSQLServerPort);
                IsSQLAvailable = true;                    
            }
            catch
            {
                IsSQLAvailable = false;
            }
        }
    }

由于以下原因,我对这种方法并不感到疯狂。

  • 容易产生假阴性
  • 需要被“ 手动 ”调用
  • 看起来“很臭”( try / catch

我曾想过使用计时器,每隔X(3 ??)分钟才调用一次,如果结果为负,请尝试第二次以减少误报。

这里有一个类似的问题-> 检测SQL Server是否正在运行,但在以下方面与我的不同:

  • 我只检查一台服务器
  • 我正在寻找一种被动的方式而不是主动的方式

最终,是否有更优雅的方法可以做到这一点? 都是“网络内”检测。

PS为提供以下回答中所要求的背景知识:我的应用程序是基本的CRUD应用程序,可以连接到我们的Central SQL Server或本地SQLExpress Server。 我有一个合并复制模块,可以使它们保持同步,并且DAL绑定到User.Setting值。 我已经可以手动将它们从“中央”切换到“本地”,然后再返回。 我只想实现一种使其自动执行此操作的方法。 我有一个NetworkChangeDetection类,可以很好地工作,但是显然不能检测到远程SQL。

考虑Windows群集监视器对SQL Server群集资源的作用:它实际上连接并运行一个虚拟查询( SELECT @@version )。 这表明SQL正在运行,正在积极侦听请求,并且能够运行请求并返回结果。 对于群集监视器,对此查询的响应是服务器的“心跳”,并且如果由于任何原因而未能获得响应,它可能会启动群集故障转移。

我认为仅连接到TCP会有一些麻烦:

  • 它省略了非TCP协议,例如本地共享内存(LPC)或远程网络管道(SMB)
  • 它需要硬编码的TCP端口号,而不是让实例端口侦听自动发现完成其工作(SQL Browser和朋友)
  • 它仅确定可以建立OS级别的套接字,而不验证SQL Server本身是否处于可运行状态(非收益调度程序可能会阻止网络IO请求接受,调度程序过载和工作人员饥饿可能会这样做,内存资源精疲力尽等)。

不幸的是,无法从SQL Server本身获得通知,说“嘿,我很活跃,您不会发送一些请求吗?”。 我不知道胖客户端(“ thick app”)的所有详细信息,但也许您应该研究一个不同的隐喻:客户端在SQL Express实例上全部在本地工作,并且这些实例在服务器可用时同步数据。 Service Broker是专门为此连接重试模式设计的,由于其异步松耦合编程API,它将隐藏服务器的可用性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM