Ref*_*din 5 .net c# sql-server .net-3.5
我们有一个内部应用程序(胖客户端),它依赖于我们的中央SQL服务器.该应用程序是一个桌面应用程序,允许用户在"离线"模式下工作(例如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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于以下原因,我并不为这种方法而疯狂.
我曾经想过要使用一个计时器,每隔X(3 ??)分钟调用一次,如果是否定结果,再次尝试减少误报.
这里有一个类似的问题 - > 检测SQL服务器是否正在运行, 但它在这些方面与我的不同:
那么到底有没有更优雅的方式呢?这都将是"网内"检测.
PS在下面的答案中提供一些背景:我的应用程序是一个基本的CRUD应用程序,可以连接到我们的中央SQL Server或本地SQLExpress服务器.我有一个合并复制模块,使它们保持同步,并且DAL绑定到一个User.Setting值.我已经可以手动将它们从中央翻转到本地并返回.我只是想实现一种让它自动执行此操作的方法.我有一个NetworkChangeDetection工作得很好的类,但很明显,它没有检测到远程SQL.
考虑Windows Cluster监视器对SQL Server群集资源的作用:它实际连接并运行虚拟查询(SELECT @@version).这表明SQL正在运行,正在主动侦听请求,并且能够运行请求并返回结果.对于群集监视器,对此查询的响应是服务器的"心跳",如果无法获得响应,则无论出于何种原因,它都可能会启动群集故障转移.
在我看来,只有连接到TCP有几个drawbaks:
不幸的是,没有办法从SQL Server本身获得通知说'嘿,我活跃,你不会发送一些请求吗?'.我不知道你的胖客户端("厚的应用程序")的所有细节,但也许你应该研究不同的比喻:客户做所有的工作在当地,在SQL Express实例,并在服务器可用这些情况下的数据同步.Service Broker是专门针对此连接重试模式设计的,由于其异步松散耦合编程API,它将隐藏服务器可用性.
| 归档时间: |
|
| 查看次数: |
277 次 |
| 最近记录: |