Почему Hibernate пытается «кэшировать» и как это работает в кластерной среде? - PullRequest
4 голосов
/ 25 сентября 2010

Допустим, у вас есть кластер серверов приложений J2EE с 4 узлами, все запущенные экземпляры приложения Hibernate.Как работает кэширование в этой ситуации?Это приносит пользу?Стоит ли его просто отключить?

Мне кажется, что данные на одном конкретном узле быстро устареют, так как другие пользователи, попавшие в другие узлы, вносят изменения в данные базы данных.В такой ситуации, как Hibernate может верить, что его кэш обновлен?

Ответы [ 2 ]

6 голосов
/ 25 сентября 2010

Прежде всего, вы должны уточнить, о каком кеше вы говорите, Hibernate имеет 3 из них (кеш первого уровня или кеш сеанса, кеш второго уровня или глобальный кеш и кеш запросов, который опирается на второй). кеш уровня) Я предполагаю, что вопрос касается кеша второго уровня, поэтому я собираюсь рассмотреть его.

Как работает кэширование в этой ситуации?

Если вы хотите кэшировать данные только для чтения, особых проблем нет. Если вы хотите кешировать данные для чтения / записи, вам нужна реализация кеша, безопасная для кластера (посредством аннулирования или репликации).

Это приносит пользу?

Это зависит от многих вещей: реализация кэша, частота обновлений, гранулярность областей кэша и т. Д.

Должен ли он просто быть выключен?

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

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

Именно поэтому вам нужна реализация кеша, безопасного для кластера.

В такой ситуации, как Hibernate может верить, что его кэш обновлен?

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

3 голосов
/ 25 сентября 2010

Во-первых, в Hibernate есть 2 кэша. Существует кэш первого уровня, который вы не можете удалить, и он называется сеансом Hibernate. Затем существует кэш второго уровня, который является необязательным и подключаемым (например, Ehcache). Он работает по многим запросам и, скорее всего, это кеш, на который вы ссылаетесь.

Если вы работаете в кластерной среде, то вам необходим кэш 2-го уровня, который может реплицировать изменения среди членов кластера. Ehcache может сделать это. Кэширование - сложная тема, и вам нужно глубокое понимание, чтобы использовать ее, не создавая других проблем. Кэширование в кластерной среде немного сложнее.

...