11

有时,并非总是如此,我会收到以下错误:“底层提供程序在打开时失败。”

这是我的情况:

我有一个我并行处理的整数键列表,用作编译的选择查询中的参数。我在 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 时,我立即得到错误。

这里使用的代码是真实代码的简化版本。我还传递了更多的键,因此更多的并行查询..有时我在内部异常中看到数据读取器正在关闭,但状态是正在连接..
我试图扩大连接池大小,但是没有成功。

有没有人很好的建议来解决这个问题?提前谢谢。

4

2 回答 2

9

您是否尝试将连接字符串中的最小池大小选项设置为更高的值?

试试下面的链接:msdn

于 2011-02-22T14:32:25.467 回答
2

我的应用程序中也发生了同样的问题,最终导致跨线程使用 ObjectContext。如果您在混合中有一个静态并最终同时执行来自两个不同线程的查询(在同一个 ObjectContext 上),那么当第一个完成关闭连接而另一个尝试打开它时,您将得到一个异常。

愚蠢的我没有从以前的项目中学到,这让我们使用了 LinqToSQL,它实际上在阅读器上抛出了一个跨线程操作异常以进行连接。不幸的是,ObjectContext 并没有以同样的方式阻止它。

于 2011-05-03T07:28:41.373 回答