2014-05-15 58 views
0

我有一個單例(因爲我認爲這將是有用的,讓這些可用的所有時間)來表示一些設置,這將清除舊的並在數據庫中加載新的設置在clr過程調用的開始。是否同時運行同一過程的多個SQL/CLR調用(如線程)?

但是,如果CLR調用像線程一樣處理,我可能會在某些時候出現問題,即在我想訪問它們的那一刻,設置被清除。

所以這會是一個問題嗎?我能用簡單的對象鎖解決這個問題嗎?

編輯:

代碼示例設置:

public class Settings 
{ 
    public static Settings Default 
    { 
     get { return _default ?? (_default = new Settings()); } 
    } 
    private static Settings _default; 

    private Dictionary<string, string> _settingsDict; 

    private Settings() 
    { 
     _settingsDict = new Dictionary<string, string>(); 
    } 

    public void ReloadSettings() 
    { 
     _settingsDict.Clear(); 

     using (var connection = new SqlConnection("context connetion=true")) 
     using (var command = connection.CreateCommand()) 
     { 
      command.CommandText = ... 
      connection.Open(); 

      // Read Settings with DataReader into _settingsDict 
     } 
    } 

    public string Get(string key) { 
     get { return _settingsDict["key"] } 
    } 
} 

步驟:

[SqlProcedure] 
public static void InsertData(SqlString csv) 
{ 
    Settings.Default.ReloadSettings(); 

    var setting = Settings.Default.Get("SETTING"); 

    using (var connection = new SqlConnection("context connetion=true")) 
    using (var command = connection.CreateCommand()) 
    { 
     ... 
    } 
} 
+1

你能展示你的代碼嗎? – st4hoo

+1

如果在您正在專門討論SQL/CLR的問題中明確說明是非常明智的。目前這隻隱藏在標籤中。 –

+0

我用代碼示例和更好的標題更新了問題 – Staeff

回答

-1

線程在SQL-CLR比,它是由​​一種叫 「SQLOS」 辦理正常的Windows代碼而不同。線程被分配給一個給定任務的調度程序,並且它們不能被重新分配給不同的線程,所以你可以在那裏做一些假設。這就是說

併發字典不幸的是使用鎖定,所以你必須非常小心,因爲它需要「不安全」的權限設置。

亞當技工對這個東西真的好介紹: http://channel9.msdn.com/Events/TechEd/NorthAmerica/2013/DBI-B404

當你運行它幾乎被分拆出來作爲自己的線程PROC。所以叫它的兩個人會衝突。

0

要做到這一點,最簡單的方法是不改變現有的字典,而是創建一個新的字典,並原子地將其寫入全局變量。

爲了有一個非只讀靜態變量,您需要SQL Server中的不安全權限。請注意這一點。您可以通過使用一個包裝類

class MutableCell<T> { public volatile T value; } 
static readonly MutableCell<...> myVar = new ...(); 

我添加了在這裏需要的,因爲多個線程都在競相讀取和寫入該變量volatile避免這種要求。

一般來說,在SQL Server中執行線程和可變狀態並不是最好的想法。這是最好的避免。您有冒險引入非常困難和災難性的錯誤。不過,你的方案看起來很合理。

相關問題