¿Qué hace el parámetro buffered en Dapper dot net?

.net dapper sqldatareader

Pregunta

Dapper dot net tiene un parámetro de buffer (un bool), pero por lo que puedo decir, lo único que hace es enviar el resultado a una lista antes de devolverlo.

Según la documentación :

El comportamiento predeterminado de Dapper es ejecutar su SQL y almacenar en búfer todo el lector a su regreso. Esto es ideal en la mayoría de los casos, ya que minimiza los bloqueos compartidos en la base de datos y reduce el tiempo de red de la base de datos.

Sin embargo, al ejecutar grandes consultas, es posible que necesite minimizar el espacio de memoria y solo cargar objetos según sea necesario. Para hacerlo pase, buffered: false en el método de consulta.

No estoy seguro de cómo el hecho de lanzar el resultado a una lista logra esto. ¿Me estoy perdiendo de algo? Mi única idea es que se supone que debe establecer CommandBehavior para ExecuteReader en CommandBehavior.SequentialAccess (pero no es así).

Respuesta aceptada

pero por lo que puedo decir, lo único que hace es enviar el resultado a una lista antes de devolverlo

No te estás perdiendo nada. Esa es la diferencia clave. Excepto que no es un elenco como tal: el objeto real devuelto es muy diferente. Básicamente, hay dos formas de leer datos:

  • en una API de transmisión, cada elemento se entrega individualmente; esto es muy eficiente en cuanto a la memoria, pero si haces un montón de procesamiento posterior por artículo, significa que tu conexión / comando podría estar "activo" por un tiempo prolongado
  • en una API protegida, todas las filas se leen antes de que se produzca nada

Si está leyendo una gran cantidad de datos (miles a millones de filas), una API no amortiguada puede ser preferible. De lo contrario, se usa mucha memoria y puede haber una latencia notable incluso antes de que esté disponible la primera fila. Sin embargo, en la mayoría de los escenarios comunes, la cantidad de datos leídos se encuentra dentro de los límites razonables, por lo que es razonable insertarlos en una lista antes de entregárselos a la persona que llama. Eso significa que el comando / lector, etc., se ha completado antes de que regrese.

Como nota al margen, el modo de búfer también evita el tan común "ya hay un lector abierto en la conexión" (o lo que sea que el fraseo sea exacto).


Respuesta popular

Tengo que estar en desacuerdo con @ chris-marisic en esto ... Me encontré con varias excepciones de "Memoria data.ToList() " en esa línea exacta ( data.ToList() ) cuando data.ToList() buffer: true . No fue una consulta de "zillion rows X bazillion columns", solo un resultado SQL de 5-6k filas regulares con aproximadamente 30 columnas.

Realmente depende de tu configuración. Por ejemplo, si su SQL e IIS se ejecutan en la misma máquina física o no. Y cuánta memoria está instalada en el equipo IIS, y cuál es la configuración del archivo de página, etc. Si el servidor web tiene 2 GB o menos, considere establecer "buffer: false" para informes súper pesados.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué