讓我們假設一個簡單的 ASP.NET MVC 控制器:
public class SomeController : Controller
{
public ActionResult SomeAction()
{
var db = new SomeDataContext(); // without 'using' or 'await using'
var models = db.Models.ToList();
return this.View(models)
}
}
如果我忘記了using 陳述句,究竟會發生什么?背景關系永遠不會暴露嗎?會不會泄露記憶體?真的是死罪嗎?
uj5u.com熱心網友回復:
這將保留一個打開的資料庫連接,并為所有被跟蹤的實體分配記憶體,直到垃圾收集發現參考都沒有被使用并實際釋放它們。
因此,如果您的 Models 表有 100k 行:
var db = new SomeDataContext(); // 1 connection from the connection pool when first query is run.
var models = db.Models.ToList(); // 100k loaded entities.
作為單個用戶進行測驗,除非您開始查看記憶體使用情況,否則您不會看到那么多……將其部署到具有 100 多個并發請求的用戶的 Web 服務器上,然后看著您的 Web 服務器逐漸被遺忘.
此外,避免將物體回傳到視圖,只將您需要的資料使用Select()或 Automapper 的ProjectTo(). (不要使用 Automapper 的Map())這不僅可以避免相關資料的延遲加載命中等陷阱,而且還可以產生更高效/更快的查詢。
始終處理您的 DbContext 實體。這意味著使用using塊或設定依賴注入來管理注入的 DbContext 的生命周期范圍,范圍為網站/服務的每個 HTTP 請求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/363728.html
標籤:C# 网站 asp.net-mvc 实体框架 实体框架核心
上一篇:使用ajax回傳JSON給了我帶有回傳引數的空白頁面
下一篇:關于razor,.NETMVC對razor和.NETrazor頁面的支持有什么區別,有沒有什么叫做.NETMVCrazor頁面?
