2012-07-07 66 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