Que fait le paramètre Buffered dans Dapper dot net?

.net dapper sqldatareader

Question

Dot net Dapper a un buffer paramètre (un bool), mais pour autant que je peux dire la seule chose qu'il fait est jeté le résultat à une liste avant de le retourner.

Selon la documentation :

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

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

Je ne suis pas sûr de savoir comment convertir le résultat en liste permet d’atteindre cet objectif. Est-ce que je manque quelque chose? Ma seule idée est qu'il est censé définir le CommandBehavior pour ExecuteReader à 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