11

常にではありませんが、「基になるプロバイダーを開くことができませんでした」というエラーが発生することがあります。

これは私の状況です:

コンパイルされた選択クエリでパラメータとして使用するために並行して処理する整数キーのリストがあります。これをRIAドメインサービスで使用します。

var queryResult = new List<int> {1, 2, 3}.AsParallel().Select(i => CompiledQueries.GetRecordByKey(this.ObjectContext, i)).ToList();

コンパイルされたクエリは次のようになります。

public static IEnumerable<CompiledQueryResult> GetRecordByKey(MyEntities _context, int _key)
    {
        if (_getRecordByKey == null)
        {
            _getRecordByKey = CompiledQuery.Compile<MyEntities, int, IEnumerable<CompiledQueryResult>>
                ((ctx, key) =>
                    ctx.Records
                    .Where(r => r.Id == key)
                    .Select(r => new CompiledQueryResult
                    {
                        Id = r.ID,
                        Name = r.Name,
                        ...
                    })
                );
        }
        return _getRecordByKey.Invoke(_context, _key);
    }

EF4、RIA(実際にはドメインサービスのObjectContextがコンパイルされたクエリメソッドに渡されます)を使用しています。接続文字列には有名なMultipleActiveResultSets = Trueが含まれています...MultipleActiveResultSetsがfalseに設定されていると、すぐにエラーが発生します。

ここで使用されているコードは、実際のコードを簡略化したものです。また、より多くのキーを渡すため、より多くの並列クエリが渡されます。内部例外で、データリーダーが閉じられているのに、ステータスが接続されていることがあります。
接続プールのサイズを拡大しようとしましたが、成功せずに。

この問題を解決するための良い提案はありますか?事前にThx。

4

2 に答える 2

9

接続文字列の最小プール サイズ オプションをより高い値に設定しようとしましたか?

次のリンクを試してください: msdn

于 2011-02-22T14:32:25.467 に答える
2

私のアプリケーションでも同じ問題が発生していましたが、最終的には ObjectContext のクロススレッド使用になりました。静的なものが混在していて、(同じ ObjectContext で) 2 つの異なるスレッドから一度にクエリを実行することになった場合、最初に完了したスレッドが接続を閉じ、もう一方が接続を開こうとすると、例外が発生します。

愚かなことに、接続のリーダーでクロススレッド操作の例外を実際にスローした LinqToSQL を使用するようになった以前のプロジェクトからは学びませんでした。残念ながら、ObjectContext はこれを同じ方法でブロックしません。

于 2011-05-03T07:28:41.373 に答える