2009-06-29 390 views
0

我有一個C#數據庫層,使用每秒鐘在後臺計時器中調用的靜態讀取方法。使用數據庫最佳實踐?

目前我創建SqlCommand,SqlConnection一次作爲類的成員。

在每一個方法調用中,我都執行命令來獲得結果,我這樣做是爲了避免每秒創建一次連接和命令,但是恐怕在這種方法中會發生異常,從而破壞連接或將對象處於無效狀態。

這是我目前的執行(定時器處理)

static void GetBarTime(object state) 
    { 
     lock (_staticConnection) 
     { 
      SqlDataReader dataReader = null; 
      try 
      { 
       dataReader = _getMaxTimeCommand.ExecuteReader(); 
       dataReader.Read(); 
       _currentTick = dataReader.GetInt32(0); 
      } 
      catch (Exception ex) 
      { 
       //Log the error 
      } 
      finally 
      { 
       dataReader.Dispose(); 
      } 
     } 
    } 

什麼是最好的做法是什麼?

更多細節:

我在一個計時器這樣做的還有另外一個prorcess更新我的表中的每一秒,有一個由一組客戶端使用,並呼籲每一秒,以獲得最新值的另一暴露方法。

因此,不是每秒鐘爲每個客戶端執行select語句,而是在一個定時器中執行並更新客戶端使用的全局變量。

+0

你能解釋的情況下,至於爲什麼你需要在定時器中編寫代碼以從DB讀取事物? DB值變化的頻率如何? – shahkalpesh 2009-06-29 06:47:28

+0

我添加了詳細信息 – 2009-06-29 07:05:23

+0

(回覆評論) – 2009-06-29 08:48:51

回答

2

SqlConnection有內置的內置池;你會看到幾乎沒有區別,如果你使用:

using(SqlConnection conn = new SqlConnection(connectionString)) { 
    conn.Open(); 
    // your code 
} 

每次。這可以自動對死亡(底層)連接作出反應。

目前你有一個錯誤,順便說一句;如果命令失敗,讀者仍然將是空的......要麼調用Dispose()之前檢查null

if(dataReader !=null) {dataReader.Dispose();} 

或只使用using

try 
{ 
    using(SqlDataReader dataReader = _getMaxTimeCommand.ExecuteReader()) 
    { 
     dataReader.Read(); 
     _currentTick = dataReader.GetInt32(0); 
    } 
} 
catch (Exception ex) 
{ 
    //Log the error 
} 
1

要找出執行是否意味着該連接是死鴨,可能相當困難。爲了安全起見,只要遇到異常,您可以關閉並重新打開SqlConnection和SqlCommand,以防萬一。當一切正常時,這不會造成任何開銷。