[英]Executing queries in parallel throws “The underlying provider failed on open.” error
有時,並非總是如此,我遇到了以下錯誤:“底層提供程序在打開時失敗了。”
這是我的情況:
我有一個並行處理的整數鍵列表,用作編譯的選擇查詢中的參數。 我在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(實際上domainservice的ObjectContext被傳遞給編譯的查詢方法),連接字符串包含着名的MultipleActiveResultSets = True ...當MultipleActiveResultSets設置為false時,我立即得到錯誤。
這里使用的代碼是真實代碼的簡化版本。 我也傳遞了更多的鍵,因此更多的並行查詢..有時我在內部異常中看到數據讀取器正在關閉,但狀態是連接..
我試圖擴大連接池大小,但沒有成功。
有沒有好的建議來解決這個問題? Thx提前。
您是否嘗試將connectionstring中的最小池大小選項設置為更高的值?
請嘗試以下鏈接: msdn
在我的應用程序中發生了同樣的問題,它最終成為了ObjectContext的跨線程使用。 如果你在混合中有一個靜態並且最終同時從兩個不同的線程執行查詢(在同一個ObjectContext上),那么當第一個完成關閉連接而另一個試圖打開它時,你將得到一個異常。
愚蠢的我沒有從以前的項目中學習,這讓我們使用了LinqToSQL,它實際上在讀取器上為連接引發了一個跨線程操作異常。 不幸的是,ObjectContext不會以同樣的方式阻止它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.