Que fait le paramètre tamponné dans Dapper dot net?

.net dapper sqldatareader

Question

Dapper dot net a un paramètre buffer (un bool), mais pour autant que je sache, la seule chose à faire est de convertir le résultat en liste avant de le renvoyer.

Selon la documentation :

Le comportement par défaut de Dapper est d'exécuter votre SQL et de mettre le lecteur entier en mémoire tampon au retour. Ceci est idéal dans la plupart des cas car cela minimise les verrous partagés dans la base de données et réduit le temps réseau sur la base de données.

Cependant, lors de l'exécution de requêtes volumineuses, vous devrez peut-être réduire l'encombrement de la mémoire et ne charger que les objets nécessaires. Pour ce faire, passez en mémoire tampon: false dans la méthode Query.

Je ne suis pas sûr de savoir comment transférer le résultat sur une liste permet d'atteindre cet objectif. Est-ce que je manque quelque chose? Ma seule idée est qu'il est censé définir CommandBehavior pour ExecuteReader sur CommandBehavior.SequentialAccess (mais ce n'est pas le cas).

Réponse acceptée

mais pour autant que je puisse dire la seule chose qu'il fait est de lancer le résultat dans une liste avant de le retourner

Vous ne manquez rien. C'est la différence clé. Sauf que ce n'est pas une distribution en tant que telle: l'objet renvoyé est très différent. Fondamentalement, il existe deux manières de lire les données:

  • dans une API de streaming, chaque élément est généré individuellement; Ceci est très efficace en termes de mémoire, mais si vous effectuez beaucoup de traitements ultérieurs par élément, cela signifie que votre connexion / commande peut être "active" pendant une période prolongée.
  • dans une API tamponnée, toutes les lignes sont lues avant tout

Si vous lisez une très grande quantité de données (des milliers à des millions de lignes), une API non mise en mémoire tampon peut être préférable. Sinon, beaucoup de mémoire est utilisée et il peut y avoir une latence notable avant même que la première ligne ne soit disponible. Cependant, dans la plupart des scénarios courants, la quantité de données lues se situe dans des limites raisonnables, il est donc raisonnable de la placer dans une liste avant de la transmettre à l'appelant. Cela signifie que la commande / lecteur, etc., est terminée avant son retour.

En outre, le mode tamponné évite également le très commun "il y a déjà un lecteur ouvert sur la connexion" (ou quelle que soit la formulation exacte).


Réponse populaire

Je ne suis pas d'accord avec @ chris-marisic à ce sujet ... J'ai rencontré plusieurs exceptions "Out of Memory" sur cette ligne ( data.ToList() ) lors de l'utilisation de buffered: true . Ce n'était pas une requête "zillion rows X bazillion columns", juste un résultat SQL de 5-6k lignes avec environ 30 colonnes.

Cela dépend vraiment de votre configuration. Par exemple, si votre SQL et IIS fonctionnent sur la même machine physique ou non. Et combien de mémoire est installée sur la machine IIS, et quel est le paramètre de fichier de la page, etc.



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