Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Parallel.Foreach循环创建多个db连接会引发连接错误吗?_C#_Sql_Entity Framework_Task Parallel Library - Fatal编程技术网

C# Parallel.Foreach循环创建多个db连接会引发连接错误吗?

C# Parallel.Foreach循环创建多个db连接会引发连接错误吗?,c#,sql,entity-framework,task-parallel-library,C#,Sql,Entity Framework,Task Parallel Library,“登录失败”错误从未重新出现,好奇吗?然而,其他连接错误似乎可以通过关闭服务器来解释。错误发生的随机性仍然是个谜 登录失败。登录名来自不受信任的域,不能与Windows身份验证一起使用 我想让代码并行运行,所以我将foreach循环改为并行foreach循环。这似乎很简单。每个循环连接到数据库,查找一些内容,执行一些逻辑,添加一些内容,关闭连接。但是我得到了上面的错误 我正在使用本地sql server和实体框架(每个循环使用自己的上下文)。使用同一本地登录或其他方式多次连接是否存在问题?我是怎

“登录失败”错误从未重新出现,好奇吗?然而,其他连接错误似乎可以通过关闭服务器来解释。错误发生的随机性仍然是个谜

登录失败。登录名来自不受信任的域,不能与Windows身份验证一起使用

我想让代码并行运行,所以我将foreach循环改为并行foreach循环。这似乎很简单。每个循环连接到数据库,查找一些内容,执行一些逻辑,添加一些内容,关闭连接。但是我得到了上面的错误

我正在使用本地sql server和实体框架(每个循环使用自己的上下文)。使用同一本地登录或其他方式多次连接是否存在问题?我是怎么做到的

我已经(在尝试转换为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));
之后

在道具里面,我使用生物实体

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 server,我不知道为什么它会工作一个小时,然后搞糟,然后再工作几秒钟以上,现在(重新启动后)工作(到目前为止大约30分钟)

您的身份没有流向执行并行for.each的底层任务的工作线程

这里的答案很好,所以我不会重复。

好的,很抱歉回答我自己的问题,但它可能对某人、某个地方、某个时候很有价值

在添加(并随后删除)以下代码以查看每个线程使用的标识时,“登录失败”错误不再发生。我不确定使用它是否影响了什么,但我现在不使用它,而且它似乎从未在最初给出的链接和答案中讨论过身份问题

Debug.WriteLine("Executing " + cloneIdAndAccessions.Item1.ToString() + " as " + WindowsIdentity.GetCurrent().Name);
这里肯定有两个问题,第一个是掩盖后者。 但我仍然遇到以下两种类型的连接错误。特别是(我注意到)在打开SQLServerManagementStudio并可能使服务器紧张之后

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循环中的对象数分为更小的组(10000个对象,而不是100000个),那么我就不会抛出任何异常。很好

因此,汇总检查标识,然后可能会分解在foreach循环中运行的组。。。然后有人找出原因并报告:)

编辑/结束


这不是最好的解决方案,但与深入研究任务和线程狂热相比相对简单。

IIRC有一些策略,在目标链接消失的情况下,包括链接的相关部分(即使对于SO问题,AFAICT也可能发生)?嗯,即使对于SO引用?如果这与我给出的链接完全相同,那么我不会感到惊讶。好吧,这两个选择都不起作用,所以我可能不清楚如何将身份流到并行中。对于每个任务,或者是完全不同的事情?@KennethIto:你不会用指向另一个答案的链接来回答。您可以投票以重复方式关闭,或将其添加为注释。@sixlettvariables。注意。虽然我不能投票以愚人的身份结束,但我想首选的方式是发表评论。相关的问题和链接中的任何建议都没有任何效果。好吧!这太奇怪了?我尝试了所有这些不同的建议,但都没有成功。然后我决定从robseder.wordpress.com链接尝试这段代码:Debug.WriteLine(“执行”+cloneIdAndAccessions.Item1.ToString()+“as”+windowsintity.GetCurrent().Name),我想看看用户名是什么样子。你难道不知道吗。现在就行了?我甚至没有身份的传递,等等。我只是添加了那个代码。奇怪的令人沮丧-它工作得如此之好以至于有一次?现在我又回到了一分钟也不过去了?
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.