【问题标题】:Many queries and too much opening / closing of the same connection许多查询和太多打开/关闭同一连接
【发布时间】:2013-05-09 02:10:20
【问题描述】:

我必须一个接一个地重新计算大量实体的值。

在此过程中,所有自跟踪实体都在同一个 ObjectContext 中更改。对于需要处理的每个实体,必须从数据库中获取少量数据。这会产生很多相同的 SQL 查询,但使用不同的参数。

我正在使用 Solutions Design 的 ORM Profiler 软件来分析发送到数据库的查询。

查询本身对我来说似乎还可以。它们很短,执行起来不需要太多时间。

但是,我对分析器如何向我显示查询的实际处理方式感到困惑:

如您所见,它不断打开和关闭同一个数据库连接。

现在,看看单个打开/查询/关闭连接的时间:

看起来打开和关闭数据库连接会浪费时间。

阅读this answer 后,我更改了我的代码,现在它看起来像这样:

using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString))
{
    using (var context = new MyEntities(connection))
    {
        // ...

我现在可以看到它仍在使用相同的连接(这很好),但是,连接仍然在查询之间不断关闭和打开。

Gert Arnold 建议我在使用上下文之前显式打开连接。然后我修改了我的代码,使它看起来像这样:

using (var connection = new EntityConnection(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString))
{
    connection.Open();
    using (var context = new MyEntities(connection))
    {
        // ...

现在可以了!每个查询都发送到同一个数据库连接:

我现在很好奇为什么我需要在使用上下文之前打开连接?

【问题讨论】:

  • 这不是重复的。我实际上可以重用相同的连接。问题是它在查询之间不断打开/关闭自己。
  • 在创建上下文之前打开连接是否也会关闭? (顺便说一句,我认为您的代码并不完全正确:new EntityConnection 两次)。
  • 有效!但前提是,正如您所建议的,我在使用上下文之前明确打开连接。你知道为什么吗?
  • 不知道为什么,可能是一个特性。我记得在某处读过它。
  • 您真正想做的是允许上下文利用连接池。这是一个非常普遍的要求,几乎所有的供应商都已经实现了它;你只需要启用它。我对 EF 不够熟悉,无法告诉您此设置的指定位置。

标签: c# entity-framework-4 database-connection self-tracking-entities


【解决方案1】:

可以使用现有连接创建上下文。很难找到有关它的文档,但如果在上下文使用它之前显式打开连接,它将保持打开状态,直到它被显式关闭或释放。我使用 EF5 ObjectContext(Linqpad 代码)对此进行了测试:

using (var conn = new EntityConnection(connectionString))
{
    conn.Open();
    using (var db = new InventoryContext(conn))
    {
        db.Products.ToList();
        conn.State.Dump();
        db.SaveChanges();
        conn.State.Dump();
    }
}

输出为OpenOpen。未打开连接时,输出为ClosedClosed

【讨论】:

  • 非常感谢!通过在使用上下文之前显式打开连接,它可以完美地工作。我编辑了我的问题以显示结果。
【解决方案2】:

另一种解决方案可能是在构造 DbContext 时打开连接:

public partial class QueryModel : DbContext
{
    public QueryModel(string connectionName):base(connectionName)
    {
        this.Database.Connection.Open();
    }
}

【讨论】:

    猜你喜欢
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2016-12-14
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多