2012-05-04 3 views
0

Я новичок в dapper и планирую использовать его в своем новом проекте. После прочтения это похоже на единственную проблему, с которой я мог столкнуться, - ConcurrentDictionary.dapper.net, как очистить ConcurrentDictionary?

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

Как избежать этой проблемы? Может кто-нибудь, пожалуйста, покажите мне какой-нибудь код, расскажите мне, как и когда его нужно очистить?

+0

Итак, вы генерируете строки SQL «на лету»? –

+0

Что значит «генерировать SQL-строки на лету»? не могли бы вы привести мне пример. – qinking126

+0

Строка SQL - вы динамически строите ее с помощью 'StringBuilder'? Или это скорее константная строка, объявленная как 'var sql = @" SELECT Foo FROM Bar "? –

ответ

2

За комментариями Наверху, вот пример на лету:

var builder = new StringBuilder(); 
builder.AppendLine("SELECT Foo FROM Bar"); 
if (fisrtName != null || lastName != null) 
    builder.AppendLine("WHERE"); 
if (firstName != null) 
    builder.AppendLine(" Bar.FirstName = @Firstname"); 
if (firstName != null && lastName != null) 
    builder.Append(" AND"); 
if (lastName != null) 
    builder.AppendLine(" Bar.LastName = @LastName"); 
var sql = builder.ToString(); 

Как вы можете видеть, фактический SQL, что щеголеватый теперь будет работать будет отличаться в зависимости от того или нет firstName и/или lastName - null. Если оба значения равны нулю, вы получаете одну строку SQL. Если только firstName не является нулевым, вы получаете другое. Если только lastName не является нулевым, вы получаете еще один. И, наконец, если оба значения не равны нулю, вы получаете четвертую перестановку.

Это то, что подразумевается под «на лету» - dapper будет кэшировать на основе этих уникальных перестановок, и, учитывая более сложный сценарий, легко увидеть, как вы в конечном итоге получите большое количество различные перестановки, все из которых нужно будет кэшировать независимо.

+0

извините, последний вопрос. запрос, который я опубликовал ранее, если я изменил значение имени. это новая перестановка? есть ли способ проверить, есть ли слишком много запросов и нужно ли вы сбрасывать ConcurrentDictionary? – qinking126

+0

Когда вы используете заполнители (например, 'где Name = @ Name'), то изменяете значение, которое вы передаете (например,' new {Name = new DbString {Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true}) ') отлично, и именно то, как предполагается использовать dapper. –