2009-10-15 118 views

回答

7

只需向SQL服务器发出一个简单的小请求,以查看连接是否有效。除此之外,如果您的连接超时或以其他方式失败,为什么不只是一个明智处理的异常?

+2

微软自己做这件事 - 一个SQL查询来询问服务器是否还活着。基本上“选择”你还活着吗?'并解析结果 – 2009-10-15 09:26:59

+5

如果ICMP流量被阻塞,Ping将失败,而数据库连接正常工作,小的简单请求语句通常是SELECT 1;对于MS-SQL或SELECT 1 FROM DUAL;对于其他数据库系统 – bbuser 2009-10-15 10:48:06

2

Ping只能用于验证数据包可以传送到目的地,但不适合检查实际服务器是否在运行。

如果您的服务器配置为提供SNMP,那么获取SNMP信息以了解您的服务器是否可操作将是一个更好的选择。

但是,编程SNMP不是一项简单的任务。如果你真的需要这些好处,那就去吧。

0

测试互联网连接。 System.Net具有许多有用的功能。 HttpWebRequest函数将尝试加载一个网站,您将得到一个详细的响应,用于测试连接。

1

这里是一个示例代码:

private bool IsInternetAvailable() 
     { 
      bool ret = false; 

      try 
      { 
       HttpWebRequest req = (HttpWebRequest) 
      HttpWebRequest.Create("http://www.yourremoteserver.com/"); 
       HttpWebResponse res 
      = (HttpWebResponse)req.GetResponse(); 
       if (res.StatusCode == HttpStatusCode.OK) 
       { 
        ret = true; 
       } 
       else 
       { 
        ret = false; 
       } 
       res.Close(); 
      } 
      catch 
      { 
       ret = false; 
      } 

      return ret; 
     } 

来源:my own blog

对于SQL Server,这是更好地 '尝试连接'。

+1

如果谷歌关闭了吗?它发生在 – 2009-10-15 10:45:45

+0

你总是需要使用'YOUR REMOTE'服务器,例如Google链接就是这样 – NinethSense 2009-10-15 11:06:02

1

要检查网络和MS-SQL服务器不执行命令:

从代码修改
// Setup a timer to call as needed 
public bool IsSqlConnectionOpen(string connectionString) 
{ 
    bool open = false; 
    using (var connection = new SqlConnection(connectionString)) 
    { 
     try 
     { 
      connection.Open(); 
      open = true; 
      connection.Close(); 
     } 
     catch (SqlException e) 
     { 
      // log e.ToString() 
     } 
    } 
    return open; 
} 

我用得到的SQL Server版本。

更新:mattcodes提出了关于连接池好点,根据MSDN

时出现致命错误,如故障转移池被自动清除。

当请求SqlConnection对象时,如果可用的连接可用,则从池中获取它。为了可用,连接必须是未使用的,具有匹配的事务上下文或者不与任何事务上下文关联,并且具有到服务器的有效链接。

如果这还不够,请在connection string中设置Pooling=false以确保。

+0

这有可能会从连接池返回一个连接池,并且随后成为运输或其他问题的牺牲品客户端和服务器之间的超时时间? – 2009-10-15 10:08:04

+0

好点马特,我会更新我的发现。 – si618 2009-10-15 10:31:16

0

要非常小心地保持这种启动逻辑。我已经看到这样的事情退化为心脏跳动逻辑,其中有很多其他有趣的问题。其中之一是,如果你的应用程序将有很多运行实例。如果您的应用程序在大型环境中使用,并且可能有数千个实例正在运行,则心跳逻辑可能会增加网络和服务器负载。或者有时心跳间隔是可配置的,有人将其设置为零或其他疯狂的值。

另外一点,我已经看到了这一点,在数据库服务器的问题询问是什么时候在服务器上。即选择GetDate()

这样做有两件事,首先您知道服务器和网络正在工作,如果您得到答案。其次,如果您有一些时间关键操作,则可以测量客户端计算机和数据库服务器之间的时钟偏差。有时候这很重要。

相关问题