2012-07-07 77 views
2

'登錄失敗'錯誤從來沒有重新出現過,好奇嗎?但其他連接錯誤似乎是通過關閉服務器來解釋的。錯誤發生的隨機性仍然是一個謎。Parallel.Foreach循環創建多個數據庫連接會引發連接錯誤?

登錄失敗。登錄是來自不受信任的域,不能用於Windows身份驗證

我想讓我的代碼並行運行,因此我將foreach循環更改爲並行foreach循環。這似乎很簡單。每個循環連接到數據庫,查找一些東西,執行一些邏輯,添加一些東西,關閉連接。但是我得到上面的錯誤?

我使用我的本地sql服務器和實體框架(每個循環使用它自己的上下文)。使用相同的本地登錄連接多次會出現問題嗎?我怎麼解決這個問題?我有(在嘗試轉換到parallel.foreach循環之前)將我的foreach對象列表拆分爲四個組(獨立的csv文件)並運行我的程序的四個併發實例(運行速度更快不僅僅是一個,因此也是並行的想法)。所以它似乎連接到數據庫不應該是一個問題?

任何想法?

編輯: 這裏的

var gtgGenerator = new CustomGtgGenerator(); 
var connectionString = ConfigurationManager.ConnectionStrings["BioEntities"].ConnectionString; 

var allAccessionsFromObs = _GetAccessionListFromDataFiles(collectionId); 

ForEach(cloneIdAndAccessions in allAccessionsFromObs) 
    DoWork(gtgGenerator, taxonId, organismId, cloneIdAndAccessions, connectionString)); 

var gtgGenerator = new CustomGtgGenerator(); 
var connectionString = ConfigurationManager.ConnectionStrings["BioEntities"].ConnectionString; 

var allAccessionsFromObs = _GetAccessionListFromDataFiles(collectionId); 

Parallel.ForEach(allAccessionsFromObs, cloneIdAndAccessions => DoWork(gtgGenerator, taxonId, organismId, cloneIdAndAccessions, connectionString)); 

的DoWork的內部之前我用的是生物實體

using (var bioEntities = new BioEntities(connectionString)) {...} 

它變得奇妙而又奇妙...

我添加了一些代碼在我的DoWork方法:

Debug.WriteLine(「Executing 「 + itemName + 」 as 「 + WindowsIdentity.GetCurrent().Name); 

,它神祕地開始工作(非常好/快實際上)。但最終我得到了同樣的例外(約一小時後)。但我能夠跟蹤這.. ..?

A first chance exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll 

EDIT2: 嗯..我在他的工作,今天上午發射它(迷戀理解爲什麼它會一點點工作),它是沿着工作正常(和快速巡航! ) 至今。偶爾:線程''(0x27c8)已退出,代碼爲0(0x0)。 線程''(0x26b8)已退出,代碼爲0(0x0)。

但除此之外它還沒有搞砸了嗎?坦率地說,這隻會讓我更擔心。這是一次性的事情,所以我可以使用它(如果它有效),但是發生了什麼?它可能是NLOG,登錄多線程堵塞了東西,並在SQL中導致超時?我真的不明白。一旦它再次停止工作,我會盡力弄清楚。有沒有辦法來重置SQL服務器,我不知道爲什麼它會工作一個小時,然後搞砸了,然後從未工作超過幾秒鐘,現在(重新啓動後)工作(約30分鐘至今)?

+0

相關問題http://stackoverflow.com/questions/10007535/tpl-task-in-wcf-service-fails-to-use-correct-iis-security-credentials-sql-conne和http:// robseder .wordpress.com/2012/04/07/asp-net-impersonation-and-parallel-foreach-issue /和http://social.msdn.microsoft.com/Forums/pl-PL/parallelextensions/thread/a1da0143- 919c-433d-9d50-83795879082d – user7116 2012-07-07 21:11:30

+0

鏈接中的任何建議都沒有任何影響。 – 2012-07-07 21:14:41

+0

好吧!這很奇怪嗎?我嘗試了所有這些不同的建議,但沒有成功。然後我決定從robseder.wordpress.com鏈接中嘗試下面的代碼:Debug.WriteLine(「Executing」+ cloneIdAndAccessions.Item1.ToString()+「as」+ WindowsIdentity.GetCurrent()。Name)我想查看用戶名看起來像。你難道不知道嗎?它現在正常工作?我甚至沒有身份傳遞等,我只是添加了代碼。奇怪的!? – 2012-07-08 04:20:29

回答

0

好的,很抱歉回答我自己的問題,但它可能對某人,某處,某個時間有價值。

在添加(並隨後刪除)以下代碼以查看每個線程正在使用的標識後,再次出現「登錄失敗」錯誤。我不確定是否使用它會影響某些內容,但我現在不使用它,並且它似乎從未在最初給出的鏈接和答案中討論過身份問題。

Debug.WriteLine("Executing " + cloneIdAndAccessions.Item1.ToString() + " as " + WindowsIdentity.GetCurrent().Name); 

一定有問題怎麼回事,和第一的掩蔽了後者。 但我仍然收到以下兩種類型的連接錯誤。特別是(我注意到)打開SQL Server Management Studio後,可能會使服務器緊張。

System.Data.EntityCommandExecutionException: An error occurred while reading from the store provider's data reader. See the inner exception for details. ---> System.Data.SqlClient.SqlException: The query processor could not start the necessary thread resources for parallel query execution. 

而且......

System.Data.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 

所以,我的解決方案(因爲我無法找到莫名其妙的時候會出現錯誤)是簡單地趕上哪個對象中的錯誤和記錄Parallel.ForEach循環將其扔出,然後重新運行這些對象。仍然比簡單的foreach循環快得多。

編輯:嗯,這很有趣,我發現了一些韻/理由的錯誤(不是當他們被拋出,但也許是爲什麼)。如果我將我的Parallel.ForEach循環中的對象數量分塊爲更小(10,000個對象而不是100,000個)組,則我從未得到任何拋出的異常。 NICE。

所以總結 - 檢查身份,那麼也許分手你集團在foreach循環中運行......有人弄清楚,爲什麼這是必要的,並報告:)

編輯/結束

不是最好的解決方案,但相對於深入研究任務和線程瘋狂而言相對簡單。

2

您的身份不會流向執行並行for.each的基礎任務的工作線程。

這裏的答案很好,所以我不會重複。 TPL Task in WCF service fails to use correct IIS security Credentials (SQL Connection)

+0

IIRC有一些政策包括鏈接的相關位以防目標鏈接消失(即使是SO問題,AFAICT也可能發生這種情況)? – 2012-07-07 19:58:14

+0

嗯,即使是SO參考?如果稍後關閉,我將不會感到驚訝,因爲它與我給出的鏈接完全相同。 – 2012-07-07 20:08:54

+0

好吧,這兩種選擇都沒有奏效,所以也許我不清楚我如何才能讓身份流向Parallel.Foreach任務,或者它完全不同? – 2012-07-07 20:52:42