nHibernate Session.Load по имени свойства - PullRequest
0 голосов
/ 04 февраля 2011

У моих DTO есть ID, который используется моей базой данных, обычно с автоматически увеличивающимся INT. Моему приложению, в общем-то, наплевать на это поле идентификатора, оно стремится искать DTO по их свойству Name. Который дал этот метод на моем уровне доступа к данным:

public T GetByName(string name)
{
    return (T) Session
        .CreateCriteria(typeof (T))
        .Add(Expression.Eq("Name", name))
        .UniqueResult();
}

Теперь, что я заметил, поскольку именно так я загружаю подавляющее большинство своих DTO, так это то, что nHibernate не кэширует результат. Я смог наблюдать через SQL Profiler, что каждый вызов этого метода приводит к обращению в базу данных, даже если я уверен, что я загружал этот конкретный объект во время своей единицы работы ( HTTP транзакция).

Кроме того, я прочитал, что nHibernate будет кэшировать DTO в кеше 1-го уровня при вызове .Load ().

Итак, мой вопрос: есть ли способ настроить nHibernate для помещения моих DTO в кэш 1-го уровня после загрузки таким образом, или мне нужно найти другой способ уменьшить количество обращений к моей базе данных?

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

Есть несколько проблем с вашим кодом.

  1. Критерии будут всегда идти в БД, если вы не кешируете запрос .Вам нужно использовать SetCacheable, настроить поставщика кэширования и включить кэширование запросов .
  2. Даже если вы кэшируете запрос, вам все равно нужно сделать объект кэшируемым также потому, что NHibernate хранит идентификаторы объектов, полученные в результате этого запроса, но не сами сущности.
  3. Так называемый «кэш 1-го уровня» - это единица работы (сеанс).Вы взаимодействуете с ним, используя методы Get и Load, а не запросы.Небольшое исключение: сущности, уже загруженные в сеанс , больше не нужно будет читать из БД.
0 голосов
/ 04 февраля 2011

Что если вы определили натуральный идентификатор как поле имени?Я не знаю, будет ли nHibernate использовать это только для генерации схемы, но имеет смысл, что это естественное место, чтобы определить это, независимо от того, что nHibernate фактически сделает с ним.Если нет, то это не плохая функция.

0 голосов
/ 04 февраля 2011

NHibernate не будет кэшировать ваши сущности в кэше первого уровня, если вы не загрузите их по их первичному ключу.

У меня была такая же ситуация некоторое время назад. Я никогда не устанавливал, будут ли объекты, не загруженные первичным ключом, кэшироваться в кеше второго уровня (если вы его используете). Возможно, кто-то еще может дать ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...