并行执行查询会导致“基础提供程序在打开时失败”。错误

时间:2011-02-21 15:37:51

标签: .net ria parallel-processing linq.compiledquery

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

这是我的情况:

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

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

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

2 个答案:

答案 0 :(得分:9)

您是否尝试将connectionstring中的最小池大小选项设置为更高的值?

请尝试以下链接:msdn

答案 1 :(得分:2)

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

愚蠢的我没有从之前的项目中学习,这让我们使用了LinqToSQL,它实际上在读取器上为连接引发了一个跨线程操作异常。不幸的是,ObjectContext不会以同样的方式阻止它。

相关问题