Hibernate, кэш второго уровня и кеш запросов - PullRequest
0 голосов
/ 30 октября 2011

Я использую Hibernate с Ehcache (не думаю, что это имеет значение, хотя) .. Когда пользователь входит в систему, я идентифицирую его по его электронной почте и использую его электронную почту для всех последующих звонков. Теперь, поскольку электронная почта не является моим «идентификатором гибернации» (который я аннотировал @Id), я должен загрузить его с запросом и, таким образом, сохранить в кеше запросов. Однако, когда пользователь выходит из системы, я не могу явно выселить его из кэша, поскольку он хранится в области, которую он разделяет с другими пользователями, которые вошли в систему с тех пор.

Мой вопрос: могу ли я загрузить пользователя в кэш 2-го уровня (таким образом, облегчая выселение), не возвращаясь снова в базу данных методом session().get(user)? Здесь есть еще один момент: если пользователь обновится, кеш запросов станет неправильным для этого пользователя. Я хочу, чтобы он обновлялся при обновлении пользователя

Ответы [ 3 ]

0 голосов
/ 30 октября 2011

Первый вопрос: почему вы хотите удалить пользователя из кеша запросов, когда он выходит из системы?Я не могу представить, почему ваша архитектура требует этого.Кэширование должно быть прозрачным, и EhCache может легко удалить пользователя, когда он больше не нужен или не помещается в кэш.

, если пользователь обновляется, Querycache станет неправильным для этого пользователя

Нет, не будет, по крайней мере, если обновление происходит через Hibernate.Вы знаете, как работает кеш запросов?В вашем случае он хранит email -> user id mapping.При запросе по email Hibernate сначала находит идентификатор пользователя , связанный с этим электронным письмом, а затем ищет пользователя по идентификатору.Если он существует в кеше 2-го уровня, он загружается оттуда.В противном случае Hibernate прозрачно загружает пользователя по id.Это все же лучше, чем запрашивать по электронной почте.

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

Я хочу, чтобы оно обновлялось при обновлении пользователя

Что вы имеете в виду?Единственные устаревшие данные, с которыми вы столкнетесь, - это пользовательские экземпляры, хранящиеся в кеше L1, L2 и кеш запросов обновляются без проблем.

См. Также: Кеширование с помощью Hibernate + Spring - некоторые вопросы!

0 голосов
/ 30 октября 2011

Ты делаешь это сложнее, чем нужно.Используйте кэш запросов, чтобы избежать попадания в базу данных каждый раз, когда вы выполняете запрос с одинаковыми аргументами.Если пользователь выходит из системы, запрос с этими конкретными аргументами не будет выполняться много позже, и кэш в конечном итоге будет исключать этот конкретный запрос из кеша на основе его политики удаления (LRU, тайм-аут и т. Д.).Кеш должен быть просто прозрачным, и вам не нужно ничего вытеснять.

Вы можете полностью избежать кеша запросов для этого варианта использования, если вы использовали идентификатор для ссылки на пользователя, а не на его электронную почту.адрес.Для этого используются идентификаторы: уникальная ссылка на сущность и возможность использовать session.get и session.load для загрузки пользователя.Использование электронной почты для входа в систему в порядке.После входа в систему приложение должно использовать его идентификатор для ссылки на пользователя, а не его адрес электронной почты.

Относительно последнего пункта: Hibernate автоматически аннулирует результаты кэша, если вы обновите пользователя.И даже если это не так, кеш запросов хранит только идентификаторы возвращенных объектов.Состояние объектов загружается из кэша объектов, который становится недействительным (или обновляется) при обновлении объекта.

0 голосов
/ 30 октября 2011
  1. Почему вы хотите выселить пользователя из кеша?Настройте кэш соответствующим образом, и он через некоторое время удалит его из кеша, когда он больше не будет использоваться.

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

Мне кажется, что вы хотите прочитать о кэшировании в Hibernate: http://www.javalobby.org/java/forums/t48846.html

...