我目前正在使用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。我尝试了以下措施:
作为测试我修改了上面的代码以运行三次,以查看第二个和第三个循环的执行时间是否使用相同的DbContext。每个连续循环运行前一个循环需要更长时间,但这可能与使用相同的DbContext相关。
我错过了什么吗?这样简单的东西真的有可能需要几分钟才能运行吗?即使我在每次循环后都没有提交数据库?有没有办法加快速度呢?
答案 0 :(得分:1)
实体框架(实际上)并不适合这种批量操作。您是否可以使用其中一种bulk insert方法与EC2?否则,您可能会发现手动编写T-SQL INSERT语句的速度要快得多。如果性能很重要,则可能超过使用EF的好处。
答案 1 :(得分:0)
我的猜测是你的ObjectContext正在积累很多实体实例。 SaveChanges似乎有一个阶段,其中加载的实体数量具有线性时间。这可能是因为它花费的时间越来越长。
解决这个问题的一种方法是使用多个较小的ObjectContexts来摆脱旧的实体实例。