[英]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.