NHibernate кеширует по уникальным индексам? - PullRequest
2 голосов
/ 27 мая 2009

У меня есть несколько классов, у которых есть свойство, уникальное для этого объекта, например, для класса User свойство Username никогда не должно дублироваться.

Кажется, что NHibernate не поддерживает загрузку объекта по уникальному ключу, который затем кэшируется так же, как это делают Load () или Get (). Я прав, когда говорю это?

Если это так, то мне просто придется сыграть свою собственную роль, возможно, с помощью метода расширения в соответствии с LoadByUniqueIndex (свойство lambda, ключ объекта).

1 Ответ

1 голос
/ 27 мая 2009

Да, вы правы, NH не получает сущности непосредственно из кэша ни для чего, кроме идентификатора. Обратите внимание, что все, кроме идентификатора, потенциально может измениться, и его нужно искать в базе данных.

Будьте осторожны при кэшировании. «Преждевременное кэширование - корень всего зла» или что-то в этом роде. Серьезно, если вы не уверены, что у вас есть заметные проблемы с производительностью, не пишите свой собственный кеш.

  • Напишите код, который передает сущности в качестве аргументов, чтобы избежать загрузки одной и той же сущности несколько раз.
  • Избегайте кэшей, которые живут дольше, чем сеанс. У вас будут устаревшие данные, если вы не уведомите обо всех изменениях.
  • Избегайте статичных кэшей, используйте вместо них статический поток. Это позволяет избежать совместного использования данных между сеансами, что может нарушить изоляцию транзакции.
  • Используйте кэши второго уровня, если вам это действительно нужно.

Если вы считаете, что у вас есть статический кеш, который живет до тех пор, пока приложение работает, я могу вам сказать, что вам лучше вообще его избегать. Он не будет работать должным образом при разумных усилиях.

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