2011-09-16 89 views
5

我有一個.NET 4.0 Winform和.NET 4.0 Windows服務,它們都通過LINQ to SQL連接到SQL 2005/2008數據庫。它在我們的測試環境中運行良好且快速,擁有完美的生產數據克隆,但在生產環境中,它的運行速度非常緩慢,CPU使用率和帶寬使用率都很低。我還注意到每天有數百個SQL超時,即使是索引良好的數據庫上的最小查詢也是如此。因此,我啓動了Profiler ...Linq-to-SQL和sp_reset_connection

我發現sp_reset_connection在10分鐘的負載下捕獲期間佔SQL CPU總持續時間的三分之一和所有SQL調用總數的90%。

  • 我試過禁用&啓用連接池和擺弄連接字符串中允許的連接數和連接超時數。沒有任何影響。
  • 我一直在用ADO.NET查詢代替我的LINQ查詢。這些舊的ADO.NET查詢從不超時。只有LINQ的。
  • 我已經注意到該服務器上的其他主要性能問題,但我不確定如何通過客戶的系統管理員來處理該主題。
  • 我在運行服務的應用程序服務器上具有Admin訪問權限。我在他們運行Winform的終端服務器上,以及SQL服務器上都沒有訪問權限。

  • 是什麼原因導致sp_reset_connection運行頻繁?

  • 有沒有辦法繞過這些調用而不會將我的應用程序中的所有LINQ都撕掉?
  • 有沒有辦法減少這個存儲過程的調用次數?
  • 有沒有辦法減少SQL服務器在這些調用中需要的處理器時間?
  • 如果我將pooling禁用並用空的替換那個存儲的proc,我會亂七八糟嗎?

回答

4

發現這一一些其他頁面,一個建議是:

您的連接復位,在使用它之前打開您的DataContext的連接,並在年底關閉。

db.Connection.Open() 
... work... 
db.Connection.Close() 
+2

除非你手動打開連接(這是我從來沒有真正做過的,因爲它是違反直覺的),或者有一個環境事務(這是一個環境事務),它會出現數據上下文在'using'塊中的每個命令之後發出'sp_reset_connection'我一直都有,所以它對我有效,我甚至沒有意識到爲什麼)。你能給一個「其他網頁」的鏈接?想要一些有關該行爲的文檔。 – GSerg

1

當sqlconnection返回到連接池時發生sp_reset_connection,現在這應該不成問題。

但現在的問題是爲什麼你會超時?是SQL服務器無法處理事務量或連接池是否耗盡,從未使用過Linq-to-sql,但確保在處理完對象後處理所有可以處理的事情......

編輯:連接池是有原因的就刪除它會likly惡化你的表現和刪除「sp_reset_connection的」會給你奇怪的錯誤數據將結轉到連接的下一個用戶...

要降低sp_reset_connection的數量,唯一的辦法是嘗試重複使用相同的連接進行儘可能多的查詢!