2

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

登录失败。登录来自不受信任的域,不能用于 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 内部,我使用 BioEntities

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 分钟至今)?

4

2 回答 2

2

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

这里的答案很好,所以我不会复制它。 WCF 服务中的 TPL 任务无法使用正确的 IIS 安全凭据(SQL 连接)

于 2012-07-07T18:49:10.173 回答
1

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

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

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 个)组,那么我永远不会抛出任何异常。好的。

所以总结 - 检查身份,然后可能会分解你在 foreach 循环中运行的组......有人弄清楚为什么这是必要的并报告:)

编辑/结束

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

于 2012-07-09T19:34:19.827 回答