Minimiser le verrouillage de la table sur une boucle SqlDataReader?

.net c# dapper sql-server

Question

J'ai le scénario suivant (gestion des exceptions supprimée, code simplifié):

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();

Ainsi, la table (exécutée sur un Sql Server 2000 surchargé) que la requête implique comporte des verrous partagés pendant quelques heures ou plus, en fonction de la quantité d'enregistrements.

Ces verrous affectent parfois d'autres applications interrogeant cette base de données. On m'a donc demandé de supprimer les verrous dès que possible.

Donc, à moins de l'évidence

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);
}

cela limiterait la quantité de documents que je peux gérer dans la mémoire de la machine, y a-t-il une autre alternative?

(Cette application que je déplace lentement vers Dapper.NET, donc c'est déjà une dépendance pour d'autres parties du code, au cas où il y aurait quelque chose dans Dapper qui pourrait aider avec ce scénario.)

Réponse populaire

C'est un vieux sujet mais voici un truc que j'utilise parfois:

  1. Commandez votre requête SQL sur la clé primaire.
  2. Lisez les principaux enregistrements ##.
  3. Lire / mettre en mémoire tampon ces enregistrements ##.
  4. Utilisez votre tampon pour effectuer le traitement.
  5. Rappelez-vous l'identifiant le plus élevé.

Retournez à 2 avec une modification: vous lisez les ## enregistrements supérieurs WHERE id> plus haut identifiant.

De cette façon, vous pouvez lire et traiter des lots de données.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi