Загрузить против Get в Nhibernate
Главная страница в моем веб-приложении выполняет аутентификацию и загружает пользовательский объект, используя Get
,
После этого всякий раз, когда пользовательский объект нужен для usercontrols или любого другого класса, я делаю Load
,
Обычно nhibernate должен загружать объект из кэша или возвращать постоянный загруженный объект всякий раз, когда Load
из называется. Но это не то поведение, которое демонстрирует мое веб-приложение. NHprof всегда показывает sql всякий раз, когда вызывается Load. Как мне проверить правильность поведения Load
?
Я использую архитектуру S#arp.
2 ответа
Если вы используете Get, то происходит попадание в базу данных. Если вы используете Load, то попадание в базу данных не производится, но объект (в вашем случае User) создается с "отложенной загрузкой". Поэтому, когда вы проверяете свойство, оно знает, что вам нужны данные, поэтому оно отправляет запрос в базу данных, чтобы получить данные.
Если вы хотите получить объект из кэша, вам нужно рассмотреть 2 варианта. Кэш первого уровня - это кэш, который используется в ОДНОМ сеансе. Поэтому, когда вы закрываете сеанс или загружаете один и тот же объект в другой сеанс, вы получаете дополнительные попадания. Кэш второго уровня работает во всех сессиях. Если один сеанс получает объект, другой сеанс получает его из кэша.
Так что вы хотите, вероятно, кэш второго уровня.
На самом деле, вызов Load для объекта, не отмеченного как ленивый, вызывает немедленную загрузку. Это потому, что не ленивые сущности никогда не проксируются. В этом случае он просто действует так же, как Get.