[英]Wrapping methods using db connection in MVC
我遵循了MVC音樂商店教程,然后進入了他們使用數據庫連接的部分( DbConnection
是DbContext
的子DbContext
)。 我被教導要創建這樣的方法(使用包裝):
public class StoreManagerController : Controller
{
//
// GET: /StoreManager/
public ActionResult Index()
{
using(var db = new DbConnection())
{
var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
return View(albums.ToList());
}
}
...
}
但是Visual Studio生成了一個如下所示的控制器:
public class StoreManagerController : Controller
{
private DbConnection db = new DbConnection();
//
// GET: /StoreManager/
public ActionResult Index()
{
var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
return View(albums.ToList());
}
...
}
我認為,Visual Studio沒錯,但是為什么要告訴我using
來包裝每個方法,以使連接盡可能短,並且讓用戶使用單獨的連接?
我認為,Visual Studio沒錯,但是為什么要告訴我使用來包裝每個方法
using(var db = new DbConnection())
{
var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
return View(albums.ToList());
}
db
的范圍僅保留在花括號內。 這可能是using
關鍵字在C#
提供服務的另一個目的。 它定義了變量的范圍,在上述情況下,它是您的db
對象。
現在,如果調試visual studio為您生成的代碼,那么您會注意到,每次創建控制器類的對象時都會調用一個Dispose method
,換句話說,將在對應的控制器內調用一個action方法。控制器。
由於以下原因,始終會丟棄DBContext實例:
當您將更多對象及其引用加載到內存中時,上下文的內存消耗可能會迅速增加。 這可能會導致性能問題。
如果異常導致上下文處於不可恢復的狀態,則整個應用程序可能會終止。
隨着查詢和更新數據之間的時間間隔的增大,遇到與並發相關的問題的機會也會增加。
有關更多信息- 參考
這可能取決於您的應用程序的可用性。 是否需要一個持久的連接,以及創建一個連接的成本(以及眾多其他因素)。
但是對於初學者來說,您應該始終處置連接(如第一種模式, 而不是 Visual Studio建議的模式),然后根據新要求或與性能相關的問題轉移到其他模式。
我在Visual Studio建議的選項中看到的最大問題是,您無法控制DbConncetion
對象的生存期,而將其留給垃圾收集器來最終處理。 這可能會在相當不確定的時間內使連接資源處於使用狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.