2012-07-08 3 views
0

Я использую hibernate, spring, jpa. В рабочем процессе я обновляю объект; но эти обновления недоступны в другом рабочем процессе. Когда я перезапускаю сервер, он отлично работает.Как удалить сущность из кэша гибернации

Есть ли способ, чтобы при обновлении объекта; Я прошу hibernate удалить его из любого кэша, который у него есть. Итак, когда этот объект необходим для любого другого рабочего процесса, создается новый запрос?

+0

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-sessioncache Помогите? – doniyor

+0

или это: http://stackoverflow.com/questions/474159/hibernate-second-level-cache-with-spring – doniyor

+1

Я не использую кеш второго уровня. Кроме того, в первом комментарии говорится об методе выселения, который недоступен в EntityManager Hibernate для JPA. evict() работает для традиционного спящего режима. – Deepak

ответ

2

Это похоже на то, что у вас есть два отдельных сеанса для одного и того же приложения, таким образом, с двумя кешами первого уровня. Кэш первого уровня - тот, который Hibernate использует для себя, в контексте сеанса. Таким образом, если вы не закрываете/не очищаете сеанс, это будет продолжать расти, возможно, конфликтуя с другими кешами 1-го уровня (в других потоках или в других виртуальных машинах). Трудно сказать, если это так, поскольку вы не указали свою среду, но вы не можете изменить кеш первого уровня другого сеанса.

Лучшим решением, чтобы избежать этого, является использование управляемого EntityManager (с вашего сервера приложений) для работы с объектами. Именно тогда роль сервера связана с таким сценарием. Но кажется, что вы делаете это «весенний путь», поэтому вам придется делать это вручную: либо очистить сеанс после его использования, либо обновить до чтения/обновления ваших данных. Затем вам понадобится какая-то блокировка (пессимистическая/оптимистичная), чтобы не потерять информацию, которая могла быть изменена из другого потока.

Смежные вопросы