2

「ログインに失敗しました」というエラーが再発したことはありません。ただし、他の接続エラーは、サーバーを非難することで説明できるようです。エラーが発生するランダム性は、まだ謎です。

ログインに失敗しました。信頼されていないドメインからのログインであり、Windows 認証では使用できません

コードを並列で実行したかったので、foreach ループを並列 foreach ループに変更しました。それは十分に単純に見えました。各ループはデータベースに接続し、何かを検索し、ロジックを実行し、何かを追加し、接続を閉じます。しかし、私は上記のエラーが発生しますか?

ローカルの SQL サーバーとエンティティ フレームワークを使用しています (各ループは独自のコンテキストを使用します)。同じローカルログインなどを使用して複数回接続すると問題がありますか? どうやってこれを回避しましたか?

(parallel.foreach ループに変換しようとする前に) foreach ループしているオブジェクトのリストを 4 つのグループ (個別の csv ファイル) に分割し、プログラムの 4 つの同時インスタンスを実行しました (全体的に 1 つよりも高速に実行されました)。したがって、並列のアイデア)。だから、データベースへの接続は問題ではないようです?

何か案は?

編集:これは前です

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);

そして、それは不思議なことに機能し始めました(実際には非常にうまく/高速です)。しかし、最終的には同じ例外が発生しました(約1時間後)。しかし、私はこれを追跡することができました..?

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

EDIT2: うーん..今朝仕事に来て起動しました(なぜそれが少しうまくいくのかを理解することに夢中になっています)、これまでのところうまく(そして速く!)動作しています。不定期 : スレッド '' (0x27c8) がコード 0 (0x0) で終了しました。スレッド '' (0x26b8) はコード 0 (0x0) で終了しました。

しかし、それ以外はまだ台無しにされていませんか?率直に言って、それは私をもっと心配しています。これは 1 回限りのことなので (うまくいけば) 使うかもしれませんが、何が起こっているのでしょうか? 複数のスレッドにログインすると、問題が発生し、SQL でタイムアウトが発生する可能性がありますか? 私は本当にそれを取得しません。それが再び機能しなくなったら、私は物事を理解しようとします。SQLサーバーをリセットする方法はありますか、なぜそれが1時間機能し、その後台無しになり、その後数秒以上機能せず、現在(再起動後)機能するのかわかりません(約30分間)これまでのところ)?

4

2 に答える 2

2

あなたの ID は、並列 for.each の基礎となるタスクを実行するワーカー スレッドに流れていません。

ここでの答えは良いものなので、複製しません。 WCF サービスの TPL タスクが正しい IIS セキュリティ資格情報を使用できない (SQL 接続)

于 2012-07-07T18:49:10.173 に答える
1

私自身の質問に答えて申し訳ありませんが、いつか、どこかで、誰かにとって価値があるかもしれません。

各スレッドが使用していた ID を確認するために次のコードを追加 (およびその後削除) すると、「ログインに失敗しました」エラーが再び発生することはありませんでした。それを使用することが何かに影響を与えたかどうかはわかりませんが、現在は使用していません。最初に提供されたリンクと回答でアイデンティティの問題が議論されているようには見えません。

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

ここには2 つの問題があったに違いありません。しかし、まだ次の 2 種類の接続エラーが発生していました。特に(私が気づいた)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 ループ内のオブジェクトの数をより小さなグループ (100,000 ではなく 10,000 オブジェクト) にチャンクすると、例外がスローされることはありません。良い。

要約 - 身元を確認してから、 foreach ループで実行されているグループを分割してください...そして誰かがなぜこれが必要なのかを理解し、報告してください:)

編集/終了

最高の解決策ではありませんが、タスクやスレッドの狂気を深く掘り下げることに比べると比較的単純です。

于 2012-07-09T19:34:19.827 に答える