Выполнение запросов в параллельном режиме выдает "Основной провайдер не удалось открыть". ошибка
Иногда, не всегда, я получаю следующую ошибку: "Основной провайдер не удалось открыть".
Это моя ситуация:
У меня есть список целочисленных ключей, которые я обрабатываю параллельно, чтобы использовать их в качестве параметра в скомпилированном запросе выбора. Я использую это в RIA domainservice.
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, я сразу получаю ошибку.
Код, используемый здесь, является упрощенной версией реального кода. Я также передаю намного больше ключей, таким образом, больше параллельных запросов. Иногда я вижу во внутреннем исключении, что устройство чтения данных закрывается, но статус подключается..
Я пытался увеличить размер пула соединений, но безуспешно.
У кого-нибудь есть хорошие предложения по решению этой проблемы? Спасибо заранее.
2 ответа
Вы пытались установить для параметра минимального размера пула в строке подключения более высокое значение?
Попробуйте следующую ссылку: MSDN
Та же самая проблема происходила в моем приложении, и это заканчивалось тем, что использовало ObjectContext между потоками. Если в миксе есть статический элемент, и в итоге вы выполняете запросы из двух разных потоков одновременно (в одном и том же ObjectContext), то, когда первым завершится закрытие соединения, а другой попытается его открыть, вы получите исключение.
Глупо, я не узнал из предыдущего проекта, где это заставило нас использовать LinqToSQL, который фактически выдал исключение операции перекрестного потока в считывателе для соединения. К сожалению, ObjectContext не блокирует это таким же образом.