Comment vider périodiquement le cache dapper.net lorsqu'il est utilisé avec SQL Server

c# dapper orm sql-server-2005 tsql

Question

Quelqu'un peut-il s'il vous plaît expliquer ce que cela signifie (à partir du site Dapper.net)

Limitations et avertissements

Dapper met en cache les informations relatives à chaque requête exécutée, ce qui lui permet de matérialiser rapidement les objets et de traiter rapidement les paramètres. L'implémentation actuelle met en cache ces informations dans un objet ConcurrentDictionary. Les objets stockés ne sont jamais vidés. Si vous générez des chaînes SQL à la volée sans utiliser de paramètres, il est possible que vous rencontriez des problèmes de mémoire. Nous pouvons convertir les dictionnaires en un cache LRU.

Je ne suis pas capable de comprendre ce que signifie la ligne en gras. J'utilise SQL Server et le client c #.

Quelqu'un peut-il s'il vous plaît donner un exemple de code c # qui va créer ce problème de mémoire. Je vous remercie

Réponse acceptée

Si vous générez des chaînes SQL à la volée sans utiliser les paramètres, il est possible que vous rencontriez des problèmes de mémoire.

Tu peux le faire:

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

ou vous pouvez le faire:

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

Ce dernier est paramétré. Il sera mis en cache une fois. Le premier n'est pas paramétré. Il sera mis en cache chaque fois que vous écrivez une requête comme celle-ci avec une valeur différente pour le email . Cela va exploser votre mémoire.

Ce dernier est largement supérieur. Il évite les attaques par injection. Dapper peut le mettre en cache une fois. SQL Server compilera le plan d'exécution une fois et le mettra en cache.

Vous devriez (impérativement) déjà utiliser des requêtes paramétrées. Si vous ne le faites pas, abandonnez tout ce que vous faites et faites-en une priorité immédiate.

Quelqu'un peut-il s'il vous plaît donner un exemple de code c # qui va créer ce problème de mémoire. Je vous remercie

Faites simplement le premier en boucle. Regardez votre mémoire grandir. Faites le dernier en boucle. Regardez votre mémoire ne pas grandir.




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