Как периодически очищать кэш dapper.net при использовании с SQL Server - PullRequest
19 голосов
/ 25 июля 2011

Может кто-нибудь объяснить, что это значит (с веб-сайта Dapper.net)

Ограничения и предостережения

Dapper кэширует информацию о каждом выполняемом запросе, это позволяет быстро материализовать объекты ипараметры процесса быстро.Текущая реализация кэширует эту информацию в объекте ConcurrentDictionary.Объекты, которые он хранит, никогда не сбрасываются. Если вы генерируете строки SQL на лету без использования параметров, возможно, у вас возникнут проблемы с памятью. Мы можем преобразовать словари в кэш LRU.

Я не могу понять, что означает жирная линия.Я использую SQL Server и клиент c #.

Может кто-нибудь дать пример кода на c #, который создаст эту проблему с памятью.спасибо

1 Ответ

47 голосов
/ 25 июля 2011

Если вы генерируете строки SQL на лету без использования параметров, возможно, у вас возникнут проблемы с памятью.

Вы можете сделать это:

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

или вы можете сделать это:

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

Последний параметризован. Это будет кэшировано один раз. Первый не параметризован. Он будет кэшироваться каждый раз, когда вы напишите подобный запрос с другим значением для email. Это взорвет вашу память.

Последний значительно превосходит. Избегает инъекционных атак. Dapper может кэшировать его один раз. SQL Server скомпилирует план выполнения один раз и кэширует его.

Вы должны (обязательно) уже использовать параметризованные запросы. Если нет, отбросьте все, что вы делаете, и сделайте это приоритетным.

Может кто-нибудь дать пример кода на c #, который создаст эту проблему с памятью. спасибо

Просто сделайте первое в цикле. Наблюдайте, как растет ваша память. Сделайте последнее в цикле. Следите, чтобы ваша память не росла.

...