我目前正在使用带有 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 有关。
我错过了什么吗?像这样简单的事情真的有可能需要几分钟才能运行吗?即使我在每次循环后都不提交数据库?有没有办法加快这个速度?