2010-08-13 30 views
3

我只是試圖對SQL Server數據庫中的表進行簡單的模式更改(通過使用SMSS中的設計工具)。每當我嘗試保存更改時,它都會保持超時。我想知道這是否是由於現有的「鎖定」桌面的連接。客戶端應用程序中的開放SqlConnections與SQL Server中的進程之間的關係是什麼?

我決定殺死連接作爲一個實驗。我查詢了master..sys進程以獲取該數據庫的當前spid,並逐個殺死它們,直到我能夠保存模式更改。 (不是很科學,但我遠離SQL Server的專家)。果然,當我殺死了所有的spids(禁止使用SMSS的那個)時,我能夠保存模式更改。

我想問一下ADO.NET SqlConnections和spids之間的關係。例如,如果客戶端應用程序在SqlConnection對象上調用Open(),是否應該在master..sysprocesses中看到另一個spid?如果我在該SqlConnection上調用Close(),怎麼樣?該spid消失了嗎?

我敢肯定這不是那麼簡單,因爲我明白有一個連接池的概念,但是有人可以闡明這種關係是如何工作的?

謝謝

大衛

回答

1

如果池=假連接字符串

SqlConnection.Open()Close()將完全相關的spid正在創建和銷燬。這將導致非常緩慢的性能:)

如果池=連接字符串

調用SqlConnection.Open()要麼使用池中現有的物理連接,或創建一個新的,如果沒有在提供真正的池。

創建一個新的物理連接將創建一個新的spid,它將在sys.sysprocessessys.dm_exec_connections中顯示爲一個新行。

重新使用現有的池化物理連接將重新使用現有的spid,因此SqlConnection.Open()不會在服務器端的這些表中進行任何可見的更改。但是,通過查找sp_reset_connection,這是一個由SqlClient調用的存儲過程,它告訴服務器清除連接狀態(例如,確保沒有事務等),可以使用SQL Profiler或XEvent檢測到它。

SqlConnection.Close()通常會返回物理連接池,所以它不會從服務器上消失。實際上,物理連接實際上是以各種不同的方式關閉的,比如被服務器殺死,如kill @spidSqlConnection.ClearAllPools()

希望是足夠的細節,還有什麼你想知道的嗎?

+0

不,這幾乎就是我所要求的。謝謝! – David 2011-09-19 08:41:07

相關問題