Cómo limpiar periódicamente la memoria caché dapper.net cuando se usa con SQL Server

c# dapper orm sql-server-2005 tsql

Pregunta

¿Alguien puede explicar lo que esto significa (desde el sitio web Dapper.net)

Limitaciones y advertencias

Dapper almacena información en caché sobre cada consulta que ejecuta, esto le permite materializar objetos rápidamente y procesar parámetros rápidamente. La implementación actual almacena en caché esta información en un objeto ConcurrentDictionary. Los objetos que almacena nunca se lavan. Si está generando cadenas de SQL sobre la marcha sin usar parámetros, es posible que tenga problemas de memoria. Podemos convertir los diccionarios a un LRU Cache.

No puedo entender lo que significa la línea en negrita. Estoy usando SQL Server y c # client.

¿Puede alguien dar una muestra del código c # que creará este problema de memoria? gracias

Respuesta aceptada

Si está generando cadenas de SQL sobre la marcha sin usar parámetros, es posible que tenga problemas de memoria.

Puedes hacerlo:

cmd.CommandText = "SELECT email, passwd, login_id, full_name " + 
                  "FROM members " +
                  "WHERE email = '" + email + "'";

o puedes hacer esto:

string s = "SELECT email, passwd, login_id, full_name " + 
           "FROM members WHERE " +
           "email = @email";
SqlCommand cmd = new SqlCommand(s);
cmd.Parameters.Add("@email", email);

Este último está parametrizado. Se almacenará en caché una vez. El primero no está parametrizado. Se almacenará en caché cada vez que escriba una consulta como esta con un valor diferente para el email . Esto explotará tu memoria.

Este último es muy superior. Evita los ataques de inyección. Dapper puede almacenarlo en caché una vez. SQL Server compilará el plan de ejecución una vez y lo almacenará en caché.

Debería (imperativo) ya utilizar consultas parametrizadas. Si no lo eres, abandona todo lo que estás haciendo y haz de esto una prioridad inmediata.

¿Puede alguien dar una muestra del código c # que creará este problema de memoria? gracias

Solo haz lo primero en un bucle. Mira cómo crece tu memoria. Haz esto último en un bucle. Mira cómo tu memoria no crece.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow