2009-10-15 167 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()

這樣做有兩件事,首先您知道服務器和網絡正在工作,如果您得到答案。其次,如果您有一些時間關鍵操作,則可以測量客戶端計算機和數據庫服務器之間的時鐘偏差。有時候這很重要。

相關問題