Pull to refresh

Comments 28

Спасибо за хорошую информацию на русском.
Эх… есть одна хорошая статья на эту же тему, но в новом дизайне блога её как-то сильно «поплющило» :(
acupof.blogspot.com/2008/01/background-hibernate-comes-with-three.html
Много полезной информации в самом MindMap'е, но текст с картинок сейчас абсолютно не читаем.
Возможно у кого-то осталась старая версия?
UFO just landed and posted this here
UFO just landed and posted this here
Кеш запросов — на уровне фабрики сессий. Но у него есть свои механизмы инвалидации, про это написано по ссылке в первом комментарии.
UFO just landed and posted this here
Если оба класса будут помечены аннотацией для кеширования, то оба объекта будут закешированы, несмотря на то что, запрос 1 с джоином.
UFO just landed and posted this here
У Вас ошибка — SharedDoc user.
По вопросу — я думаю зависит от того как будет выглядеть мапинг SharedDoc в классе User.
UFO just landed and posted this here
Да, в этом конкретном вопросе — это важно.
Вообщем если попытаться ответить баз маппинга, то должно быть приблизительно так —
если при session.load(User.class, 1L) делается выборка и User и SharedDoc (отдельными селектами или джоинами) то оба объекта будут в кеше. И во втором запросе значение будет доставаться из кеша.
UFO just landed and posted this here
Не совсем понятен вопрос. Можно точнее сформулировать? Или описать гипотетическую ситуацию
UFO just landed and posted this here
Вопрос ко второму пункту — как именно обновило? Через ту же сессию что была открыта в пункте 1? Через ту же фабрику сессий или напрямую в БД =)?
UFO just landed and posted this here
Если так, то если на момент шага 3 мы имеем ту же сессию что и в случае 1, то данные будут не консистентны. Если же на шаге 3 у нас открывается новая сессия то все будет ок.
Даже если бы не было кеша первого уровня, то результат зависит ещё и от уровня изоляции в БД.
Если уровень изоляции Repeatable read или Serializable, то даже с отключенным кешем первого уровня вы получите одни и те же данные в одной транзакции, но разные в разных транзакциях.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
1. На самом деле, хибернейт сам не реализует кеширование как таковое
2. Хибернейт не хранит сами объекты Ваших классов. Он хранит информацию в виде массивов строк, чисел и т. д. И идентификатор объекта выступает указателем на эту информацию. Концептуально это нечто вроде Map, в которой id объекта — ключ, а массивы данных — значение. Приблизительно можно представить себе это так:
1 -> { «Pupkin», 1, null, {1,2,5} }

Как первое вяжется со вторым? И если второе — истина, как hibernate восстанавливает объект, если, например, для этого требуются некие хитрые действия?

PS Насколько я помню проксирование объектов можно отключить.
Отлично вяжется. Хибернейт достает объект из базы, скажем, в виде списка полей. И если провайдер кеша видит необходимость кеширования, то кеширует этот объект (который в виду списка) у себя, так как хибернейт передает ссылку на этот объект провайдеру. Как то так.

Как хибернейт восстанавливает объект из списка я не знаю. Нужно смотреть код.
Наверное, глупо звучит, но забыл что Hibernate сам маппирует объект с представлением в базе.
Не, он не передаёт ссылку. Он передаёт уже поля объекта, а не сам объект — так называемые dehydrated entity. Это сделано для того, чтобы не хранить объекты (т.к. кеш второго уровня может быть и не в вашем адресном пространстве приложения), а так же для того, чтобы испытывать меньше проблем с рассинхронизацией данных между БД, кешем и разными сессиями Hibernate
Начиная с версии Hibernate 3.3 кэш 2-го уровня включается так:

Вместо hibernate.cache.provider_class нужно указывать hibernate.cache.region.factory_class. И тут 2 варианта:
net.sf.ehcache.hibernate.EhCacheRegionFactory либо синглетон: net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory

Пруфлинк: Ehcache documentation
Точно, спасибо. Вообще не обратил на это внимание.
Так (hibernate.cache.region.factory_class) включается кеш, если в зависимостях непосредственно ehcache-core В случае старого доброго hibernate-ehcache Нужно использовать hibernate.cache.provider_class
Sign up to leave a comment.

Articles