У моих DTO есть идентификатор, который используется моей базой данных, обычно с автоматическим инкрементом INT. Мое приложение, в общем, никогда не заботится об этом поле идентификатора, оно имеет тенденцию искать DTO по свойству Name. Который дал этот метод в моем слое доступа к данным:nHibernate Session.Load по названию свойства
public T GetByName(string name)
{
return (T) Session
.CreateCriteria(typeof (T))
.Add(Expression.Eq("Name", name))
.UniqueResult();
}
Теперь, что я заметил, так это то, как я загружаю подавляющее большинство моих DTOS, что NHibernate не кэшировать результат. Я смог наблюдать через SQL Profiler, что каждый вызов этого метода приводит к обратному соединению с базой данных, даже если я уверен, что загрузил этот конкретный объект во время моей единицы работы (HTTP-транзакция).
Кроме того, я прочитал, что nHibernate будет кэшировать DTO в кеше 1-го уровня при вызове .Load().
Итак, мой вопрос: есть ли способ сконфигурировать nHibernate, чтобы поместить мои DTO в кеш 1-го уровня после загрузки таким образом или мне нужно найти другой способ уменьшить количество обращений к базе данных?
То, что кэшируется в кэше второго уровня, определяется с помощью конфигурации кэша второго уровня. В этом случае необходимо будет включить кеширование результатов, поскольку вы действительно выполняете запрос для извлечения объекта. –