1

在 asp.net mvc 应用程序中,我使用 EF5,并为每个 http 请求创建一个 DbContext 实例。我的代码不会担心打开/关闭数据库连接,因为这是由 EF 本身处理的。

我的问题:

  1. 如果我在一个 http 请求中使用 DbSet 进行多个数据库读/写操作。每个操作都需要打开/关闭数据库连接吗?在一个 http 请求中,最终可能会打开/关闭如此多的开销,这很昂贵。

  2. 如果上述问题是,我可以自己手动管理打开/关闭数据库连接,以便它在 begin_request 处打开并在 end_request 处关闭吗?

谢谢

4

2 回答 2

1
  1. 是的,但它是由连接池处理的,所以不用担心。保存更改发生在许多实体的单个打开连接上。
  2. 不,这可能是可能的,但很难实施,因为它非常内部且没有记录。您可以浏览源代码并尝试,但不值得,您将长时间保持连接打开,连接池可能会受到影响。

我们有带有 EF4 的生产服务器,并且我们看不到一天时间内近 1000 个同时请求的性能问题。

于 2013-07-28T08:11:35.067 回答
0

您可以使用以下 DbContext 构造函数在 Entity Framework 6 上手动管理连接:

DbContext(DbConnection, Boolean)

有一个例子(伪代码):

// ...
var myConnection = new SqlConnection(myConnectionString);
var myDbContext = new MyDbContext(myConnection, false);
// ...
// TODO: you must close and dispose "myConnection" manually

MyDbContext 在哪里:

class MyDbContext : DbContext 
{
   // ....

   // constructor
   MyDbContext(DbConnection conn, boolean contextOwnsConnection)
     : base (conn, contextOwnsConnection) 
   {
      // ...
   }

   // ....

}

如果您使用“true”作为 contextOwnsConnection,则在释放我们的 DbContext 时连接将关闭。

有关布尔参数的帮助,请参阅https://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.113).aspx上的文档

请注意,通过使用这种方法,我们可以使用具有相同连接的多个 DbContext。

另请注意,我们可以根据我们正在连接的数据库使用连接。在以下示例中,我们安装了 ODP for Entity Framework 以使用 Oracle:

var myConnection = new OracleConnection(myConnectionString);
于 2015-07-01T13:14:04.520 回答