Уровень услуг, который реализует свою персистентность на основе JPA, может получить огромную прибыль от кеша второго уровня, который прозрачно управляется поставщиком JPA (например, Hibernate, Toplink / Toplink Essentials и т. Д.). Когда этот кеш активирован, он содержит экземпляры постоянных классов, как только они были загружены из базы данных в первый раз. Для настройки поведения кеша могут быть специфические расширения от производителя.
Стандарт JPA также поддерживает оптимистическую блокировку за счет наличия поля отметки времени или версии, которое используется для предотвращения повреждения данных при одновременных обновлениях. Поскольку этот механизм полагается на данные, содержащиеся в базе данных, его также можно использовать, когда другие приложения или службы хотят обновить данные - просто включите поле версии записи в обновление, и все готово.
Когда дело доходит до кеширования, похоже, что провайдер JPA (по крайней мере, Toplink Essentials) не замечает изменений в базе данных, которые не выполняются с помощью EntityManager.
Это действительно поведение по умолчанию, и ответственность за обновление / аннулирование кеша провайдера JPA лежит на приложении? Если да, то это кажется довольно нелогичным по сравнению с тем фактом, что большинство баз данных используется множеством различных приложений.