私は現在、CodeFirstでEntityFramework4.2を使用しています。現在、AmazonEC2で実行されているWindows2008アプリケーションサーバーとデータベースサーバーがあります。アプリケーションサーバーには、1日に1回実行される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を使用して2番目と3番目のループの実行時間が確認されました。連続するすべてのループは、前のループよりも実行に時間がかかりましたが、同じDbContextの使用に関連している可能性があります。
私は何かが足りないのですか?これほど単純なものを実行するのに数分かかる可能性は本当にありますか?各ループの後にデータベースにコミットしなくても?これをスピードアップする方法はありますか?