Hibernate и Ehcache - как сделать так, чтобы каждый «выбор» проходил через кеш сущностей? - PullRequest
3 голосов
/ 15 ноября 2011

У меня есть объект (аннотации JPA с интерфейсом запросов Hibernate), который имеет составной бизнес-ключ из двух свойств (external-id и subsidiary-id [это внешний ключ]) и первичный ключ БД.

У меня есть многопоточный процесс JavaSE, который запускается «по отношению к дочерней компании» и должен запрашивать / обновлять / вставлять эти объекты, используя этот составной ключ (он получает наборы данных из этих external-ids).

Я могу гарантировать, что после загрузки такого процесса никакой другой процесс не попытается вставить / обновить / удалить эту дочернюю компанию.

Я хочу, чтобы при запуске загружались все существующие сущности этой дочерней компании, а затем каждый запрос на пару [externalId,subsidiaryId] проходить через кеш и только в случае пропуска проходить через БД.В случае, если один из потоков процесса вставляет сущность, я, конечно, хочу, чтобы это было добавлено в этот кеш.

Какой лучший курс действий?

Я знаю, что есть кеширование запросов, но из того, что я могу собрать, все равно будет пропущен первый раз каждая [externalId,subsidiaryId] пара.

Спасибо, и если есть что-то, что мне не совсем понятно, пожалуйста, спросите

Обновление
Мне пришлось прекратить исследовать эту проблему, но теперь, когда я пришелВозвращаясь к этому, я думаю, что кажется разумным, что только кеш запросов и ответ JB Nizet являются единственными применимыми.
Я приму ответ JB Nizet, так как он интересен, и я мог бы использовать его (пока не уверен).

1 Ответ

2 голосов
/ 21 ноября 2011

Я бы использовал кеш второго уровня для сущности, запрашивал все сущности дочерней компании при запуске (это заполнит кеш второго уровня) и инициализировал кеш приложения, который просто отображал бы [externalId, subsidiaryId] в [id],

Затем, каждый раз, когда вы ищете объект с данным [externalId, subsidiaryId], сначала получите его идентификатор из кэша приложения, затем

  • , если идентификатор не находится вкэшируйте, выполняйте запрос, обновляйте кэш приложения и возвращайте найденный объект
  • , если идентификатор находится в кэше, получите объект, используя его идентификатор, который перейдет в кэш второго уровня и не попадет вDB
...