Ich habe folgendes Szenario (Ausnahmenbehandlung entfernt, Code vereinfacht):
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();
Die Tabelle (die auf einem überbelegten Sql Server 2000 ausgeführt wird), an der die Abfrage beteiligt ist, hat für einige Stunden oder mehr gemeinsame Sperren, abhängig von der Anzahl der Datensätze.
Diese Sperren wirken sich manchmal auf andere Anwendungen aus, die diese Datenbank abfragen. Daher wurde ich gebeten, die Sperren so schnell wie möglich zu entfernen.
Also, kurz vor dem Offensichtlichen
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);
}
das würde die Anzahl der Datensätze begrenzen, die ich mit dem Speicher der Maschine umgehen kann. Gibt es eine andere Alternative?
(Diese App gehe ich langsam zu Dapper.NET, so ist es bereits eine Abhängigkeit für andere Teile des Codes, falls etwas in Dapper, das mit diesem Szenario helfen könnte.)
Es ist ein altes Thema, aber hier ist ein Trick, den ich manchmal verwende:
Gehe zurück zu 2 mit einer Änderung: Du liest die höchste ## records WHERE id> höchste ID.
Auf diese Weise können Sie Datenchargen lesen und verarbeiten.