У меня возникли проблемы с пониманием, откуда запрос HQL
получает информацию. Мой проект использует разные потоки, и каждый поток читает/записывает в базу данных. Темы не разделяют объекты Session, вместо этого я использую класс HibernateUtil
, который создает сеансы для меня.Hibernate HQL только попадает в кеш сеанса
До недавнего времени я только закрыл сессию после написания, но не после прочтения. Изменения в объектах будут немедленно замечены в базе данных , но при чтении в других потоках (другой объект сеанса, чем тот, который используется для записи). Я получил бы устаревшую информацию. Чтение и запись происходили всегда на разных потоках, что означает разные объекты сеанса и разные сеансовые кеши.
Я всегда думал, что с помощью HQL
вместо Criteria
, я всегда целевой базы данных (или кэш второго уровня), а не кэш сеанса, но при отладке мой код, это было сделано для меня ясно, что HQL искал объект в кеше сеанса и извлекает старый устаревший объект.
Я ошибался, полагая, что HQL
всегда нацелен на базу данных? Или, по крайней мере, кэш второго уровня?
PS: Я использую только один объект SessionFactory
.
поэтому первый раз, когда мой объект сеанса выполняет запрос HQL, он нацелен на db. результат затем сохраняется в кеше сеанса. то во второй раз, когда я выполняю тот же запрос HQL, он считывает кеш вместо таргетинга на базу данных. это поведение по умолчанию. Я понял это правильно? ** ps: ** действительно, закрытие сессий после каждого чтения и записи (короткие объекты 'Session') решает мою проблему. – alegen
@alegen: HQL будет запускаться в базе данных * каждый раз *, но объекты Java, являющиеся конечным результатом этого запроса, могут поступать из кеша сеанса. Это поведение по умолчанию. – skaffman
у вас сэр отличный день! Спасибо за ответ :) – alegen