使用 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。这是一个坏主意吗?
在 EF6 中,是不是可以使用每个调用结构的上下文跨服务调用执行事务?