在MVC中使用数据库连接包装方法



我在学习MVC音乐商店教程,了解了它们使用数据库连接的部分(DbConnectionDbContext的子级)。我被教导创建这样的方法(使用包装):

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对象。

现在,如果您调试visualstudio为您生成的代码,那么您会注意到,每次创建控制器类的对象时,都会调用一个Dispose method,换句话说,在相应的控制器内调用一个操作方法。

DBContext实例总是由于以下原因而被释放-

  • 当您将更多对象及其引用加载到内存中时,上下文的内存消耗可能会迅速增加。这可能会导致性能问题。

  • 如果异常导致上下文处于不可恢复状态,则整个应用程序可能会终止。

  • 随着查询和更新数据的时间间隔的增加,遇到并发相关问题的几率也会增加。

更多信息-参考

这可能取决于应用程序的可用性;无论你是否需要一个持久的连接,以及创建一个连接的成本(以及无数其他因素)。

但对于初学者来说,您应该始终处理连接(如在第一种模式中,而不是Visual Studio建议的连接),然后根据新的需求或性能相关问题转移到其他模式。

我在Visual Studio建议的选项中看到的最大问题是,您无法控制DbConncetion对象的生存期,而是将其留给垃圾收集器最终处理。这可能会使连接资源在相当长的一段时间内处于使用状态。

最新更新