2012-08-05 71 views
0

我在我的應用程序中使用了SQL Server管理對象。應用程序中SMO對象的大多數操作都是直接從UI觸發的。例如。用戶操縱一個對象,導致從SMO對象(表,視圖,...)讀取或寫入屬性。從多個線程使用SMO

現在我想介紹一個後臺操作,它將定期掃描一些對象(只讀)。

我的問題是如果這可能導致SMO問題。從文檔中我知道對象的實例成員不是線程安全的。所以我的計劃是每當從UI或後臺線程訪問它時,都會鎖定每個SMO對象。但是如果我同時訪問兩個不同的對象(例如View和Table),會發生什麼。即使我只讀了一個屬性,該對象可能也沒有完全創新,需要從數據庫中加載。因此,在最壞的情況下,SMO需要同時對兩個對象進行初始化。由於我不知道SMO如何在內部處理這個問題,所以我想知道是否有人知道SMO是否允許這樣做,否則會導致問題。

有關如何解決此問題的其他建議?我想避免爲整個SMO庫設置全局鎖...

謝謝!

+0

需要更好地定義「將定期掃描某些對象」的「某些對象」。你在SMO對象上做什麼類型的操作? – Paparazzi 2012-08-05 19:03:25

+0

我正在讀取所有標準數據庫對象(數據庫,表,視圖,存儲過程)中的名稱和模式,以向用戶顯示數據庫樹,就像在SQL Server Managment工作室中一樣。然後,我正在讀寫這些對象的MS_Description屬性,這些對象位於ExtendedProperties內部。後臺線程定期讀取相同的屬性。 – aKzenT 2012-08-06 07:48:34

+0

不知道全局鎖對象是什麼意思,也沒有完全初始化。在完全初始化之前,您無權訪問對象。如果你同時初始化兩個對象,那麼你有兩個對象。什麼是問題? – Paparazzi 2012-08-06 12:49:46

回答

0

我使用SMO,我學到的是如果你想做一些通常的操作(腳本......),它是有用的。但是如果你想真正管理數據庫對象,最好使用系統存儲過程(所以SMO將不會是另一層理解)。使用存儲過程允許您鎖定數據或不鎖定數據,並且將成爲可能的解決方案

+0

那麼,我沒有太多的要求。我並不需要很多數據庫「管理」。看到我上面的評論。只需要將數據庫樹dsiplay到用戶並讀/寫一些屬性。 – aKzenT 2012-08-06 07:56:28

+0

嗨,如果你想初始化你的數據庫對象的屬性,你可以使用你的服務器對象的SetDefaultInitFields。 – 2012-08-06 08:18:05

+0

我知道關於SetDefaultInitFields。對不起,但這與這個問題有什麼關係?問題是如果你在同一時間吸收兩個物體會發生什麼。 – aKzenT 2012-08-06 12:28:11