2012-04-22 46 views
1

我有一個站點使用LINQ To Entites來處理數據庫。LINQ到實體多次運行查詢和超時過期

我經常遇到一個例外:

到期超時異常

我檢查SQL事件探查器和我看到某些查詢似乎(如預期,而不是一次)經常執行。這些查詢需要很長時間。

當我直接對數據庫運行查詢時,它會很快執行。

Screenshot of my query

這樣做有什麼原因,怎麼能解決呢?

+0

你是否嘗試增加命令超時屬性,如myObjectContext.CommandTimeout = 10; – Habib 2012-04-22 09:46:19

+0

嗨habib,感謝您的回答,但這不是問題,因爲查詢不應超過2秒才能完成,超時默認爲30秒。 – 2012-04-22 09:53:11

回答

1

對於探查器中的選定查詢,持續時間爲30176毫秒,這是30秒以上。這是你的超時時間。您需要查看數據庫,並找出爲什麼查詢需要花費2秒鐘(仍然看起來很多)需要30秒。

+0

查詢需要很長時間通過linq,但是當我通過sql直接運行查詢時,它非常快。你可以假設問題出現在linq代碼中,但問題不一致,通常卡住的同一個查詢有時可以順利運行。再加上這個問題在生產中經常存在,而且很難發展。難道我的聯繫不會因爲某種原因而被處置並導致這個問題? – 2012-04-25 07:22:17

+0

有些情況下EF可能花費大量時間準備查詢。這與TPT等更高級的映射場景有關。但是,在這種情況下,您可能會在兩種環境中始終看到問題。我想說的是,你發送的截圖清楚地表明,數據庫花費了30多秒才能執行這個查詢。我想這裏的方法是首先確定這是EF還是數據庫問題。如果這是EF,那麼這可能有所幫助:http://msdn.microsoft.com/en-us/data/hh949853 – Pawel 2012-04-25 16:37:17

+0

如果您確實泄漏(即不關閉)連接,您可以看到一些延遲。在負載較重的情況下,您可能會看到一個異常情況:「Timeout過期。從池中獲取連接之前已超時。」如果負載不是很重的垃圾收集器可能能夠在調用connection.Open之後但在超時過期之前處置連接對象。在你的情況下,很難判斷你看到了什麼超時,因爲異常消息是非常通用的 - 它可能是超時從池中獲取連接,連接到數據庫或執行查詢。 – Pawel 2012-04-25 16:44:49