Выполнение запросов в параллельном режиме выдает «Базовый поставщик не удалось открыть».ошибка - PullRequest
10 голосов
/ 21 февраля 2011

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

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

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

Код, используемый здесь, является упрощенной версией реального кода. Я также передаю намного больше ключей, таким образом, больше параллельных запросов .. Иногда я вижу во внутреннем исключении, что считыватель данных закрывается, но статус подключается ..
Я пытался увеличить размер пула соединений, но безуспешно.

Есть ли у кого-нибудь хорошие предложения по решению этой проблемы? Спасибо заранее.

Ответы [ 2 ]

9 голосов
/ 22 февраля 2011

Вы пытались установить для параметра минимального размера пула в строке подключения более высокое значение?

Попробуйте следующую ссылку: msdn

2 голосов
/ 03 мая 2011

Та же проблема возникала в моем приложении, и в конечном итоге это было межпотоковое использование ObjectContext. Если в миксе есть статический элемент, и в итоге вы выполняете запросы из двух разных потоков одновременно (в одном и том же ObjectContext), то, когда первым завершится закрытие соединения, а другой попытается его открыть, вы получите исключение.

Глупый я не узнал из предыдущего проекта, в котором это привело нас к использованию LinqToSQL, который фактически выдавал исключительную операцию перекрестного потока в считывателе для соединения. К сожалению, ObjectContext не блокирует это таким же образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...