簡體   English   中英

使用多個Entity Framework上下文並行查詢

[英]Parallelization of queries using multiple Entity Framework contexts

考慮一下需要執行和合並數據庫中幾個隔離查詢的結果的情況。 每個單獨的查詢均基於從其他位置提供的參數。

一種方法是依次執行這些查詢並合並結果:

public IEnumerable<SomeEntity> GetSomeEntities(List<int> parameters)
{
    var entities = new List<SomeEntity>();

    using(var context = new MyContext())
    {
        entities = parameters.SelectMany(p=> SomeComplexQuery(p);
    }

    return entities;
}

上述解決方案的問題在於,性能現在與參數列表的大小成正比。 SomeComplexQuery相對耗費資源。

另一種解決方案是使用並行化:

public IEnumerable<SomeEntity> GetSomeEntities(List<int> parameters)
{
    var entities = new List<SomeEntity>();

    Parallel.ForEach(parameters, p => 
    {
        using(var context = new MyContext())
        {
            entities.AddRange(SomeComplexQuery(p)); // Assume thread-safety
        }
    };

    return entities;
}

當我運行上述解決方案時,可以獲得更好的結果,但是我很擔心:

  • 並行打開多個上下文會引起什么問題? 如果我們有一個大小為20甚至更大的參數列表怎么辦? 系統負載會導致進一步的不良結果嗎?

  • 專門針對SQL Azure,由於建立新的數據庫連接時增加了延遲,這會被認為是一個壞主意嗎?

我正在使用Entity Framework 6,Azure Web角色和SQL Azure。

可以運行多個線程,每個線程都有自己的上下文實例。 我自己在一個過程中執行此操作,該過程可能會引起相對較多的插入或更新,到目前為止沒有任何問題。

.Net連接池是線程安全的:沒有物理數據庫連接會受到競爭條件的影響。 可以訪問物理連接的.Net DbConnection對象不是線程安全的,但是每個上下文都管理自己的連接對象,因此它們不會被多個線程共享。 Sql Azure連接也被池化,但是您必須部署重試策略(與任何Sql Azure連接一樣)。 EF6 支持連接彈性

請注意, List<T>不是線程安全的。 您最好對entities使用並發集合

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM