DbContext和连接池
在我inheritance的应用程序中,这是在基本控制器中,应用程序中的每个其他控制器都inheritance自。
public BaseController() { db = new MyDbContext(); db.Database.Log = s => Debug.Write(s); } public MyDbContext() : base("name=MyDbContext") { // hack to force Visual Studio to deploy the Entityframework.SqlServer package var instance = SqlProviderServices.Instance; }
由于应用程序的设计方式,每个请求至少创建2个上下文。 (这是一个MVC应用程序,每个页面都调用HomeController以及为特定页面调用其他控制器。)
我的问题是DbContext
创建与SQL Server的连接? 是在创建上下文时,还是仅在执行查询时?
如果它是前者,那么我将使用两倍于SQL服务器的连接数量而不是需要的数量,如果它是后者那么它可能不是太大的问题。
我不认为我能在不久的将来重构这一点,当然也不是没有道理的。 我应该注意这个设计有哪些潜在的缺陷?
entity framework6.1.3
因为您没有尝试在上下文的构造函数中自己创建和传递连接,所以,正如其他人所说,EF将根据需要从连接池获取/释放连接,而不是在构造时。
请注意EF文档中的引用:
连接
默认情况下,上下文管理与数据库的连接。 上下文根据需要打开和关闭连接。 例如,上下文打开一个连接以执行查询,然后在处理完所有结果集时关闭连接。
有些情况下,您希望更好地控制连接何时打开和关闭。 例如,使用SQL Server Compact时,打开和关闭相同的连接非常昂贵。 您可以使用Connection属性手动管理此过程。
有关更多信息,请参阅以下链接:
entity framework遵循开放晚期和早期关闭原则。 因此,它只在需要时打开连接,IE实现查询,然后尽快关闭它。
如果可以,您应该根据请求移动到单个上下文实例。 这还可以在单个事务中保留请求期间发生的所有事情。 如果使用dependency injection容器来实例化控制器,则可以非常轻松地执行此操作。
只有在执行查询时才会打开连接。 连接池由ADO.NET类(SqlConnection)管理。 每个请求有多个DbContext实例是可以的,有时是必要的。 一般来说,您不会有两次连接数。
- wpf C#中的内存泄漏
- 如何在单击窗体上的X(关闭按钮)时阻止validation被触发
- 无法连接到FTP:(553)不允许使用文件名
- 如何在第一次运行ClickOnce部署的应用程序时检测到?
- 读取NetworkStream = 100%的CPU使用率
- 如何使用C#基于条件更改gridview单元格颜色
- System.Web.Script.Serialization.JavaScriptSerializer或System.Runtime.Serialization.Json.DataContractJsonSerializer?
- 对象到对象映射实用程序
- C#(不是ASP / MVC / WinForms) – 捕获类中的所有exception