8

我們有一個用C#編寫的Web服務,它可以調用MS SQL Server 2005數據庫。該代碼使用Using塊與C#的連接池相結合。爲什麼如此多的sp_resetconnections用於C#連接池?

在SQL跟蹤期間,我們看到許多對「sp_resetconnection」的調用。其中大部分是短暫的< 0.5秒,但是有時候我們會收到長達9秒的通話。

從我讀過的內容來看,sp_resetconnection與連接池有關,並且基本上重置了打開連接的狀態。我的問題:

  • 爲什麼打開的連接需要其狀態重置?
  • 爲什麼這麼多這樣的電話!
  • 什麼可能會導致調用sp_reset連接花費非常少的時間。

這對我來說是相當神祕的,我很欣賞任何和所有的幫助!

+0

如果您有一個顯示sp_reset_connetion花費很長時間的事件探查器跟蹤,爲什麼不看該客戶在調用之前做了哪些工作?這應該讓你知道在通話期間什麼狀態正在被拆除。 – ahains 2009-06-07 17:34:39

回答

12

重置只是簡單地重置事物,以便您不必重新連接即可重置它們。它清除諸如SET或USE操作之類的連接,因此每個查詢都有一個乾淨的平板。

連接仍在重用中。下面是一個extensive list

sp_reset_connection的重置連接的以下幾個方面:

  • 它重置所有錯誤狀態和數字(如@@ ERROR)
  • 它停止所有歐共體的(執行上下文),其是執行並行查詢的父EC的子線程
  • 它將等待任何未完成的I/O操作未完成
  • 它將釋放服務器上的任何保留緩衝區b Ÿ連接
  • 將解鎖的連接所使用的任何緩衝資源
  • 它會釋放分配由連接擁有的所有內存
  • 這將清除由連接創建的任何工作或臨時表
  • 它會殺死被連接
  • 擁有全球所有的遊標將關閉所有打開
  • 它會刪除所有打開的SQL-XML相關的工作表中的任何開放SQL,XML手柄
  • 將關閉所有系統TA統計局
  • 將關閉所有用戶表
  • 它會刪除所有臨時對象
  • 將中止開放交易
  • 當入伍
  • 這將減小對用戶的引用計數它將從分佈式事務缺陷在當前數據庫中;其釋放的共享數據庫鎖定
  • 這將釋放獲取的鎖
  • 它會釋放可能已被收購
  • 將所有的SET選項重置爲默認值的任何手柄
  • 這將重置@@ ROWCOUNT值
  • 這將重置@@標識值
  • 它將使用重置任何會話級別的跟蹤選項DBCC TRACEON()

sp_reset_connection的不會復位:

  • 的安全上下文,這就是爲什麼基於完全相同的連接字符串
  • 如果輸入使用sp_setapprole應用程序的作用,因爲應用程序角色將無法恢復
  • 連接池的匹配連接
  • 事務隔離級別(!)
1

下面是它說的What does sp_reset_connection do?的解釋,部分「數據訪問API的圖層,如ODBC,OLE-DB和SqlClient中調用(內部)ST當重新使用連接池中的連接時,應用程序sp_reset_connection。它會在重新使用之前重置連接的狀態。「然後它給出了系統sproc所做的一些具體細節,這是一件好事。

1

每次從池中請求新連接時都會調用sp_resetconnection。 它必須這樣做,因爲池不能保證用戶(你,程序員可能:) 已經離開連接在一個適當的狀態。例如以未被完成的交易返回舊的連接將是..bad。

調用的nr應與您獲取新連接的次數相關。

至於一些不重要的時間,我不確定。可能是當時服務器正忙於處理其他內容。可能是網絡延遲。

1

基本上呼叫是清除狀態信息。如果你有任何開放的數據讀取器,它會花很長時間才能發生。這是因爲你的DataReader只保存一行,但可能會拉更多的行。在復位之前,它們都必須被清除。因此,確保你在using()語句中擁有所有內容,並且不會在某些語句中保留任何內容。

發生這種情況時,您運行了多少個總連接?

如果你有一個最大值爲5,並且你全部打了5,那麼調用重置將會被阻止 - 並且它似乎需要很長時間。它真的不是,它只是阻塞在一個池式連接上等待變得可用。

另外,如果您在SQL Express上運行,您可以非常容易地受到線程要求的阻止(也可能發生在完整的SQL Server中,但不太可能)。

如果關閉連接池,會發生什麼情況?