Как периодически промывать кэш dapper.net при использовании с SQL Server
-
26-10-2019 - |
Вопрос
Может кто -нибудь объяснить, что это значит (с веб -сайта dapper.net)
Ограничения и предостережения
Dapper Cachs Информация о каждом запросе, который он запускает, это позволяет быстро реализовать объекты и быстро обрабатывать параметры. Текущая реализация кэширует эту информацию в объекте CondurentDictionary. Объекты, которые он хранит, никогда не промывается. Если вы генерируете строки SQL на лету без использования параметров, возможно, вы попадете в проблемы с памятью. Мы можем преобразовать словаря в кэш LRU.
Я не могу понять, что значит линия жирным шрифтом. Я использую SQL Server и C# Client.
Может ли кто -нибудь дать образец кода C#, который создаст эту проблему памяти. благодарю вас
Решение
Если вы генерируете строки 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#, который создаст эту проблему памяти. благодарю вас
Просто сделай первое в петле. Смотрите, как ваша память растут. Сделайте последнее в петле. Смотрите, как ваша память не растут.