Как периодически очищать кеш dapper.net при использовании с SQL Server

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

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

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

Я не могу понять, что означает линия, выделенная жирным шрифтом. Я использую SQL Server и клиент С#.

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


person Gullu    schedule 25.07.2011    source источник


Ответы (1)


Если вы генерируете строки 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 один раз скомпилирует план выполнения и кэширует его.

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

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

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

person jason    schedule 25.07.2011