繁体   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