При параллельном выполнении запросов возникает ошибка «Базовый поставщик не работает при открытии. ”Ошибка

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

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

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

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

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

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

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

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

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

10
задан ssanchezz23 21 February 2011 в 15:37
поделиться