1

次のシナリオがあります(例外処理が削除され、コードが簡素化されました):

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 にある場合に備えて、既にコードの他の部分に依存しています。)

4

2 に答える 2

0

最近のコメントがないため、私のコメントを回答として試します。

#temp テーブルを選択します。そして、ロックの一般的なレビュー。いくつかの行ロックかもしれません。同じ順序でテーブルを更新していることを確認してください。handleRecord はどのように見えますか?

于 2012-06-22T13:31:14.997 に答える