2011-09-29 40 views
3

我有一個CLR進程,它在SQL Server2008下運行。它構建一個緩存的幾個表數據以保存在一個靜態類中,供其他調用稍後使用。在SQL Server 2008中CLR中的線程處理

我的問題是我可以通過產生線程來加載緩存中的每個數據集/表加載此緩存的過程嗎?

以前我已經避開了這個,因爲各種帖子都建議把線程管理留到SQL Server。不過,我真的可以加快這個過程。 目前它是一個加載每個數據集的順序過程。如果我可以同時運行這些,那將非常方便。我在CLR封面外完成了許多工作,以獲得額外的性能提升。

任何想法的幫助提示非常感謝。

回答

4

你可以使用線程,但他們必須表現。否則,你將失去使用它們的好處。

the CLR Host Environment

如何SQL Server和CLR工作一起

本節討論SQL Server如何集成了線程, 調度,同步和SQL 服務器的內存管理模式和CLR。特別是,本節從可擴展性,可靠性和安全性目標的角度審視了集成。 當SQL Server內部託管 時,SQL Server本質上充當CLR的操作系統。 CLR調用由SQL Server執行的低級例程 ,用於線程,調度,同步, 和內存管理。這些是與SQL Server引擎使用的其餘部分相同的基元。這種方法提供了幾個可擴展性,可靠性和安全性好處。

可擴展性:常見的線程,調度和同步

CLR調用SQL Server的API來創建線程,無論是對正在運行的用戶 代碼和其自身的內部使用。爲了在多個線程之間同步 ,CLR調用SQL Server同步對象。 這允許SQL Server調度程序在 線程正在等待同步對象時調度其他任務。例如,當CLR啓動垃圾回收時,其所有線程都會等待垃圾回收 完成。因爲CLR線程和它們正在等待的同步對象對於SQL Server調度程序是已知的,所以SQL 服務器可以調度運行其他數據庫任務的線程,而不是涉及CLR的 。這還使SQL Server能夠檢測到涉及CLR同步對象所採用的鎖的死鎖 ,並採用傳統技術來解決死鎖問題。

託管代碼在SQL Server中搶先運行。 SQL Server調度程序 有能力檢測並停止未產生大量時間的線程。將CLR線程掛接到SQL 服務器線程的能力意味着SQL Server調度程序可以在CLR中識別 「失控」線程並管理其優先級。這種失控的 線程被掛起並放回隊列中。 重複標識爲失控線程的線程不允許運行 給定的時間段,以便其他正在執行的工人可以運行。