使用 EF 6 DbContexts 重用数据库连接是不是可以节省时间?

Posted

技术标签:

【中文标题】使用 EF 6 DbContexts 重用数据库连接是不是可以节省时间?【英文标题】:Does reusing a DB connection with EF 6 DbContexts save time?使用 EF 6 DbContexts 重用数据库连接是否可以节省时间? 【发布时间】:2014-08-12 11:11:25 【问题描述】:

我的代码中到处都是using 块,这些块实例化、使用和处置DbContext 对象。如果我将打开的连接传递给这些对象的构造函数,是否会提高性能,或者连接池在这方面为我做了足够的工作吗?

【问题讨论】:

如果你使用了这么多的上下文,你就是在滥用 EF。通常,您应该为每个请求提供一个上下文,并为请求所做的一切共享整个对象模型。 虽然不是“每个请求”,但我每个查询只使用一个DbContext,它必须打开它自己的,或者一个池化的,或者如果没有池化,一个共享的连接。这种情况经常发生。 【参考方案1】:

这取决于您寻址的数据库系统,以及 ADO.NET 提供程序是否支持该特定数据库系统的连接池。

回答您的问题:对于 SQL Server,否,但对于 SQL Server Compact,是。

【讨论】:

您不能断言 ADO.NET 不支持 SQL Server 的连接池吗?我一定是误会了你。 我在回答你的问题,回答澄清/更新。【参考方案2】:

如果您的提供商支持它,根据我的经验,连接池可以很好地处理这个问题。如果您认为这是一个瓶颈,您当然应该进行基准测试。

以类似的思路,我曾经创建了一个这样的类:

class Foo

    SqlConnection con;
    SqlCommand cmd1, cmd2;

    void DoStuff();

    static Foo GetFoo()  get from cache, or create a new one. 

我没有为每个请求构建一个新的,而是保持连接打开并准备好执行命令,缓存整个Foo 对象。令人失望的是,这只是非常稍微提高了 SQL Server 的性能。

在您的情况下,还有实体框架的整个另一层,因此您的整体改进将变得不那么重要。一般来说,我假设如果您使用的是 EF,那么您首先不需要大量性能,因此为如此小的收益增加的复杂性可能不值得。

【讨论】:

以上是关于使用 EF 6 DbContexts 重用数据库连接是不是可以节省时间?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架:一个数据库,多个DbContexts。这是一个坏主意吗?

带有 EF 6 的 MySql 连接器

在 EF6 中,是不是可以使用每个调用结构的上下文跨服务调用执行事务?

ASP.NET MVC 4 EF6 无法连接到 SQL Server Express 数据库

为啥我有否定的“Active DbContexts”?

我可以重用代码来为 EF Core 的子属性选择自定义 DTO 对象吗?