次のコード行があります。
log4net.LogManager.GetLogger("m").Debug(DateTime.Now.ToString("hh:mm:ss.fff") + "Check-1");
Setting setting = session.CreateQuery("from Settings s").UniqueResult< Setting>();
log4net.LogManager.GetLogger("m").Debug(DateTime.Now.ToString("hh:mm:ss.fff") + "Check-2");
上記のコードはミリ秒未満で実行されます (Check-1 と Check-2 の時間は同じで、時間はミリ秒単位で測定され、使用される基準はコードに示されていません)。
しかし、この場合:
IList< チケット> チケット = session.CreateQuery("チケットから").List< チケット>();
foreach(チケットのチケット t)
{
t.Dosomething = 5;
log4net.LogManager.GetLogger("m").Debug(DateTime.Now.ToString("hh:mm:ss.fff") + "Check-1"); Setting setting = session.CreateQuery("from Settings s").UniqueResult< Setting>(); log4net.LogManager.GetLogger("m").Debug(DateTime.Now.ToString("hh:mm:ss.fff") + "Check-2");
}
上記のコードは、大量のデータを処理する巨大な処理コードの単純化されたバージョンであり、foreach ループで別のクエリが必要でした。forech ループのクエリは 500 ミリ秒で実行されます。チケット コレクションには 15000 行が含まれます。
私はすでにコードをリファクタリングしました (foreach にクエリはありません) が、同じクエリを単独で実行すると実行に時間がかからず、最初に大量のエンティティが読み込まれた後に実行すると非常に遅くなる理由に興味がありますか?
しかし、上記の同じシナリオで、2 番目のクエリに別のセッションを使用すると、すぐに実行されました。
膨大な量のエンティティの foreach ループで別のクエリを実行する必要がある場合に、そのようなケースに対処する方法についての推奨事項はありますか?