0

我目前正在使用带有 Code First 的 Entity Framework 4.2。我目前有一个 Windows 2008 应用程序服务器和一个在 Amazon EC2 上运行的数据库服务器。应用程序服务器安装了一个每天运行一次的 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() 以查看应用程序服务器与数据库对话时是否与网络相关。这并没有改变结果。
  • 将我的应用程序服务器从 Amazon 上的中型实例更改为高 CPU 实例,以查看它是否与资源相关。这导致服务器不再最大限度地使用 CPU,并且执行时间略有改善。但是,执行时间仍然是几分钟。

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

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

4

2 回答 2

1

实体框架(就目前而言)不太适合这种批量操作。您是否可以在EC2中使用其中一种批量插入方法?否则,您可能会发现手动编写 T-SQL INSERT 语句要快得多。如果性能很重要,那么这可能超过使用 EF 的好处。

于 2012-04-24T20:03:36.410 回答
0

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

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

于 2012-04-24T19:47:27.083 回答