次のシナリオがあります(例外処理が削除され、コードが簡素化されました):
SqlDataReader rdr = executeQuery(query);
while (rdr.Read()) {
//There are thousands of records, so this happens thousands of times
handleRecord(rdr); //Takes a couple of seconds
}
rdr.Close();
そのため、クエリに関係するテーブル (過密な Sql Server 2000 で実行されている) は、レコードの量に応じて、数時間以上ロックを共有しています。
これらのロックは、このデータベースにクエリを実行している他のアプリケーションに影響を与えることがあるため、できるだけ早くロックを解除するように依頼されました。
だから、明白なことを除いて
List<Record> rList = new List<Record>();
SqlDataReader rdr = executeQuery(query);
while (rdr.Read()) {
//There are thousands of records, so this happens thousands of times
storeRecord(rList,rdr); //Takes milliseconds
}
rdr.Close();
foreach (Record r in rList) {
handleRecord(r);
}
マシンのメモリで処理できるレコードの量に制限がかかります。他に代替手段はありますか?
(このアプリはゆっくりと Dapper.NET に移行しているため、このシナリオで役立つ可能性のあるものが Dapper にある場合に備えて、既にコードの他の部分に依存しています。)