簡體   English   中英

asp.net mvc在一頁實體框架上並行查詢太多嗎?

[英]asp.net mvc too many queries on one page entity framework parallel?

我正在使用asp.net mvc 5建立一個網站。

目前,我正在使用依賴項注入將每個請求的dbcontext注入到我的控制器中。

但是EF不是線程安全的,因此一個dbcontext不能用於並行查詢中。

值得對我的網站進行更改,讓此頁面像這樣使用smt嗎?

using(var ctx = new dbcontext) {
    //creating a task query like tolistasync
}

using(var ctx2 = new dbcontext) {
    //creating a task query like tolistasync
}

using(var ctx3 = new dbcontext) {
    //creating a task query like tolistasync
}
.
.
.
.
.
.
.
using(var ctx20 = new dbcontext) {
    //creating a task query like tolistasync
}

接着:

 Task.WhenAll(t1,t2,t3,......,t20)

或者我應該每個請求只使用一個dbcontext並做這樣的事情:

 var query1result = await query1.ToListAsync();
 var query2result = await query2.ToListAsync();
 var query3result = await query3.ToListAsync();
 var query4result = await query4.ToListAsync();
 .
 .
 .
 .
 .
 var query19Result = await query19.ToListAsync();
 var query20Result = await query20.ToListAsync();

在第一種情況下,到db的打開和關閉連接會很多。

在第二秒中將有一個連接,但一切都順序發生

哪種情況更好?為什么?

但是EF不是線程安全的,因此一個dbcontext不能用於並行查詢中。

“線程安全”與“支持多個並發操作”完全不同。

值得對我的網站進行更改,讓此頁面像這樣使用smt嗎?

哪種情況更好?為什么?

只有你可以回答那個問題。

但是,有一些一般性指導。

首先,針對數據庫的操作通常是I / O綁定的,而不是CPU綁定的。 請注意,此規則有很多例外。

其次,如果所有/大多數操作都在同一個數據庫中,則在文件級別上肯定會發生爭用。

第三,如果數據庫位於傳統(即非固態)硬盤驅動器上,則在磁盤盤片級別上還會有更多爭用。

因此,所有這些都是說, 如果您的后端只是一個普通的SQL Server,那么當服務器處於正常負載時,您可能不會從並發數據庫操作中看到任何好處(即,更快的響應時間)。 實際上,在這種情況下,您可能根本看不到異步數據庫調用(與同步調用相比)沒有任何好處。

但是, 如果您的后端更現代,例如一個Azure SQL實例(尤其是在SSD上運行的實例),那么並發數據庫操作確實可以加快您的請求。

首先,問問自己-您是否確實存在性能問題? 如果否,請在一個DbContext照常進行DbContext 這是最簡單,最安全的方法。

如果有問題? 我們試試吧:

如果您的查詢是只讀的,則可以並行運行多個線程。 創建新的DbContext並打開新的連接-並不是一個大問題。 另外,您可以使用AsNoTracking調用所有只讀查詢。 因此,EF不會在上下文中緩存實體。

但是,請三思。 在並行執行的代碼中調試和發現問題更加困難。 因此,您的操作必須非常簡單。

如果確實需要處理大量查詢,則可以並行運行它們。 我將使用Parallel.ForEach

暫無
暫無

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

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