2010-06-30 25 views
4

後臺WCF堆棧,在實體框架中實現了數據訪問,簡單ASP.NET前端Async = true和實體框架

這是一個兩部分問題。

最近,我們遇到了一個問題,與一個例外,上面寫着週期性崩潰:

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available

我們已經運行我們沒有問題申請了一個多星期,然後所有的突然,我們擊中了與該隨機崩潰/如果我不得不猜測,我會說這是網絡相關的,但我們無法確定確切的來源。是否有人定期收到此消息?如果是的話,根源是什麼?

第二個問題是有人建議在我們的實體框架連接字符串中設置「async = true」。我之前的印象只是啓用了異步API。當您使用EF時,這會做什麼嗎?切換此標誌是否對EF生成的查詢執行任何操作?

回答

6

爲了成爲那個人,我會自己回答這個問題。

首先,我發佈了關於「async = true」對實體框架的影響的問題至MS,並且沒有人像往常一樣回答...(如果他們回答我將更新此帖子)。

我們的問題:

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The specified network name is no longer available

當時的環境有關。有些事情導致數據庫運行速度稍慢,但這暗示了一個更大的問題。顯然,當你在線程之間共享上下文時(不是一個容易解決的問題),EF有着可怕的問題,所以我們看到了開放連接的競爭狀態。

我們基本上只有一個「只讀上下文」,只有得到。我們的問題是兩個線程試圖打開在同一時間,1個勝場的連接,其他輸了球導致下面的異常的一些變化:

The connection was not closed. The connection's current state is connecting.

我們的解決方案是我們的單轉換爲是線程特定的。不完全是我們想要的,但它的工作,當我們推動這個修復時,我們的另一個問題神奇地消失了。

這個問題的後半部分是async = true做的。說到EF,它讓我們的系統崩潰了。我們有代碼,沒有一個加入一個塊,如果異步=真,MARS =假,我們得到了:

There is already an open DataReader associated with this Command which must be closed first

一旦我們削減MARS,並禁用異步事情好了起來。