簡體   English   中英

在MVC中使用數據庫連接的包裝方法

[英]Wrapping methods using db connection in MVC

我遵循了MVC音樂商店教程,然后進入了他們使用數據庫連接的部分( DbConnectionDbContext的子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.

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