我使用.NET Framework 4.0,C#和SQL Server 2008 R2的Windows Server 2008 R2上。我的LINQ to SQL數據上下文位於單獨的庫中,並且有問題的代碼正在Windows服務中運行。我有一個經過良好測試的任務關鍵型存儲過程,它需要大約19個參數(我知道我知道),執行一些簡單的「if」邏輯並構建一些變量,並將數據插入到3個表中。它不使用遊標或臨時表。我已經描述了SP的功能,因爲我無權發佈sql代碼。LINQ to SQL中是否存在一個錯誤或限制,導致存儲過程超時?
我看到許多直徑大約SQLEXCEPTION互聯網由於命令超時的帖子,並響應很少超過「增加命令超時」。 Example
我得到了上述異常,因此嘗試在創建數據上下文時創建數據上下文至10分鐘。在等待那10分鐘後,我仍然得到例外。然後我添加了一些調試日誌記錄來捕獲從LINQ到SQL的輸出,並使用相同的參數值在SQL Server Management Studio中運行SP。它在第二個的分數中成功完成。
這裏的LINQ to SQL的日誌輸出(帶回到默認的超時),還有一些其他的日誌輸出混合,我已經在這個崗位混淆的SP名稱:
16:01:37 15269 Irrelevant log line, deleted for StackOverflow
EXEC @RETURN_VALUE = [dbo].[NAMEHIDDENONSTACKOVERFLOW] @Eastings = @p0, @Northings = @p1, @Speed = @p2, @UpdateDate = @p3, @UserId = @p4, @Postion = @p5, @Direction = @p6, @VehicleId = @p7, @Status = @p8, @Confidence = @p9, @Latitude = @p10, @Longitude = @p11, @PosLatitude = @p12, @PosLongitude = @p13, @WatchBoxId = @p14, @LastWatchBoxId = @p15, @WatchBoxIdAlert = @p16, @ImbolizationState = @p17, @TowAwayAlertState = @p18
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [560120]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [5754714]
-- @p2: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p3: Input DateTime (Size = -1; Prec = 0; Scale = 0) [02/08/2011 20:45:08]
-- @p4: Input Int (Size = -1; Prec = 0; Scale = 0) [11]
-- @p5: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [Swindon United Kingdom]
-- @p6: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [5]
-- @p7: Input Int (Size = -1; Prec = 0; Scale = 0) [15269]
-- @p8: Input Int (Size = -1; Prec = 0; Scale = 0) [901]
-- @p9: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p10: Input Float (Size = -1; Prec = 0; Scale = 0) [51.939899]
-- @p11: Input Float (Size = -1; Prec = 0; Scale = 0) [-2.125414]
-- @p12: Input Float (Size = -1; Prec = 0; Scale = 0) [51.9333333]
-- @p13: Input Float (Size = -1; Prec = 0; Scale = 0) [-2.1]
-- @p14: Input Int (Size = -1; Prec = 0; Scale = 0) [-1]
-- @p15: Input Int (Size = -1; Prec = 0; Scale = 0) [-1]
-- @p16: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p17: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @p18: Input Int (Size = -1; Prec = 0; Scale = 0) [0]
-- @RETURN_VALUE: Output Int (Size = -1; Prec = 0; Scale = 0) [Null]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
16:02:23 0 Error in DoPoll 1 Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
唯一的線索,我從Stack Overflow搜索得到的結果是,可能存在一個叫做「參數嗅探」的問題,但是我仍然在閱讀它來研究它的含義。
這是真正的關鍵的東西,如果它在生產中失敗,我會得到很多的麻煩,所以我很想回滾LINQ,並返回到香草ADO。我的問題是:我的方法有什麼問題(換句話說:我是白癡嗎?)還是在LINQ to SQL中有一些問題或錯誤可能導致此問題?有什麼我可以做的,以解決這個問題,還是更好地恢復到香草ADO?
有幾件事情來嘗試,如果是參數嗅探:http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/和http: //stackoverflow.com/questions/6986607/a-5sec-sp-hitting-a-30sec-timeout-through-linq-to-sql/6986902#6986902 –
http://stackoverflow.com/questions/211355/parameter- sniffing-or-spoofing-in-sql-server也相當不錯。 –
+1「我知道我知道」:) – AakashM