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属性手动管理此过程。
有关更多信息,请参阅以下链接:
https://msdn.microsoft.com/en-us/data/jj729737
https://msdn.microsoft.com/en-us/data/dn456849
entity framework遵循开放晚期和早期关闭原则。 因此,它只在需要时打开连接,IE实现查询,然后尽快关闭它。
如果可以,您应该根据请求移动到单个上下文实例。 这还可以在单个事务中保留请求期间发生的所有事情。 如果使用dependency injection容器来实例化控制器,则可以非常轻松地执行此操作。
只有在执行查询时才会打开连接。 连接池由ADO.NET类(SqlConnection)管理。 每个请求有多个DbContext实例是可以的,有时是必要的。 一般来说,您不会有两次连接数。
上述就是C#学习教程:DbContext和连接池分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1039159.html