Выполнение запросов в параллельном режиме выдает "Основной провайдер не удалось открыть". ошибка

Иногда, не всегда, я получаю следующую ошибку: "Основной провайдер не удалось открыть".

Это моя ситуация:

У меня есть список целочисленных ключей, которые я обрабатываю параллельно, чтобы использовать их в качестве параметра в скомпилированном запросе выбора. Я использую это в 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 не блокирует это таким же образом.

Другие вопросы по тегам