Гибернация с EHCache - сохраните любую некэшируемую сущность, поместив ее в Cache - PullRequest
2 голосов
/ 15 июля 2011

Я пытаюсь использовать кэширование 2-го уровня для Hibernate с EHCache.В приложении настроены некоторые объекты, помеченные @Cache, и я вижу, что EHCache использует их правильно.

Однако я заметил, что при сохранении / обновлении любой другой объект, который не являетсяпредполагается кэшировать;Я вижу, что он добавляется в кеш методом put ().Извлечение данных НЕ помещает не кешированный объект в кеш.

Это поведение мне не кажется правильным, поскольку мы должны только добавлять кешированные объекты в кеш, а не какой-либо объект при сохранении./ операция обновления.

Я что-то здесь упускаю?

Я вижу объекты, добавляемые в журналы, когда я выполняю любую операцию сохранения / обновления.

2011-07-15 22:02:28 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put (83) |ключ: mmd_addresses значение: 5368822204260352 2011-07-15 22:02:28 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put (83) |ключ: значение fqng_users: 5368822205923328 2011-07-15 22:02:29 ОТЛАДКА [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put (83) |ключ: fqng_link_user_applications значение: 5368822209306624 2011-07-15 22:02:30 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put (83) |ключ: mmd_addresses значение: 5368821964824576 2011-07-15 22:02:30 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put (83) |ключ: fqng_users значение: 5368821964824576 2011-07-15 22:02:30 DEBUG [http-0.0.0.0-8080-1] EhcacheGeneralDataRegion.put (83) |ключ: fqng_link_user_applications значение: 5368821964824576 2011-07-15 22:05:55 ОТЛАДКА [http-0.0.0.0-8080-6] EhcacheGeneralDataRegion.put (83) |ключ: fqng_users значение: 5368823053987840

Ни один из этих объектов не имеет аннотации @Cache.

@Entity 
@Table(name = "fqng_users", uniqueConstraints = @UniqueConstraint(columnNames = "NAME")) 
// @Audited 
public class Users implements java.io.Serializable { 

@Entity 
@org.hibernate.annotations.Entity(dynamicUpdate = true) 
@Table(name = "mmd_addresses") 
// @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
public class Addresses implements java.io.Serializable { 

1 Ответ

1 голос
/ 20 июля 2011

Хм .. проблема была в использовании кеша запросов с org.hibernate.cache.UpdateTimestampsCache . Потребовалось некоторое время с базой кода Hibernate, чтобы понять это.

При использовании StandardQueryCache ; Hibernate сохраняет последние обновленные метки времени для каждой таблицы в UpdateTimestampsCache , чтобы знать, когда в последний раз таблица обновлялась. Это помогает нам отслеживать, обновлялся ли какой-либо объект в кэше запросов после отслеживания результатов запроса.

Поскольку Hibernate не может отслеживать точные сущности, он добавляет все сущности в UpdateTimestampsCache , которые были сохранены / обновлены. По сути, put (), который я видел, фактически помещал типы сущностей (в частности, таблицы) в UpdateTimestampsCache и аннулировал их и заменял на новое значение всякий раз, когда сущность того же типа вставлялась / обновлялась через Hibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...