实体框架4.2问题的问题首先需要很长时间才能将行添加到数据库中

时间:2012-04-24 19:38:09

标签: entity-framework entity-framework-4 ef-code-first

我目前正在使用Code First的Entity Framework 4.2。我目前在Amazon EC2上运行Windows 2008应用程序服务器和数据库服务器。应用程序服务器安装了Windows服务,每天运行一次。该服务执行以下代码:

// returns between 2000-4000 records
var users = userRepository.GetSomeUsers();

// do some work

foreach (var user in users)
{
    var userProcessed = new UserProcessed { User = user };
    userProcessedRepository.Add(userProcessed);
}

// Calls SaveChanges() on DbContext
unitOfWork.Commit();

此代码需要几分钟才能运行。它还会最大化应用程序服务器上的CPU。我尝试了以下措施:

  • 在应用程序服务器与数据库通信时,删除unitOfWork.Commit()以查看它是否与网络相关。这并没有改变结果。
  • 将我的应用服务器从中型实例更改为亚马逊上的高CPU实例,以查看它是否与资源相关。这导致服务器不再使CPU最大化,执行时间略有改善。但是,执行时间仍然是几分钟。

作为测试我修改了上面的代码以运行三次,以查看第二个和第三个循环的执行时间是否使用相同的DbContext。每个连续循环运行前一个循环需要更长时间,但这可能与使用相同的DbContext相关。

我错过了什么吗?这样简单的东西真的有可能需要几分钟才能运行吗?即使我在每次循环后都没有提交数据库?有没有办法加快速度呢?

2 个答案:

答案 0 :(得分:1)

实体框架(实际上)并不适合这种批量操作。您是否可以使用其中一种bulk insert方法与EC2?否则,您可能会发现手动编写T-SQL INSERT语句的速度要快得多。如果性能很重要,则可能超过使用EF的好处。

答案 1 :(得分:0)

我的猜测是你的ObjectContext正在积累很多实体实例。 SaveChanges似乎有一个阶段,其中加载的实体数量具有线性时间。这可能是因为它花费的时间越来越长。

解决这个问题的一种方法是使用多个较小的ObjectContexts来摆脱旧的实体实例。