Хобрук: Ваш путь к мастерству в программировании

Актуальность кеша JPA с одновременным доступом к базе данных

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

Стандарт JPA также поддерживает оптимистическую блокировку за счет наличия поля отметки времени или версии, которое используется для предотвращения повреждения данных при одновременных обновлениях. Поскольку этот механизм полагается на данные, содержащиеся в базе данных, его также можно использовать, когда другие приложения или службы хотят обновить данные - просто включите поле версии записи в обновление, и все готово.

Когда дело доходит до кеширования, похоже, что провайдер JPA (по крайней мере, Toplink Essentials) не замечает изменений в базе данных, которые не выполняются с помощью EntityManager.

Это действительно поведение по умолчанию, и ответственность за обновление / аннулирование кеша провайдера JPA лежит на приложении? Если да, то это кажется довольно нелогичным по сравнению с тем фактом, что большинство баз данных используется множеством различных приложений.


Ответы:


1

Это поведение также верно для Hibernate (19.2. Кэш второго уровня):

Имейте в виду, что кеши не знают об изменениях, внесенных в постоянное хранилище другим приложением. Однако их можно настроить на регулярное истечение срока хранения кэшированных данных.

Звучит разумно. Как ваш кеш должен знать о любых изменениях, сделанных другим приложением, если оно не использует кеш? Единственная возможность, оставшаяся для поставщика кеша / JPA, - это отслеживать базу данных (все таблицы, все данные) на предмет изменений и соответственно обновлять. На самом деле это невозможно.

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

09.10.2009
  • Конечно, я понимаю, как мониторинг всей базы данных влияет на производительность. Интересно, может ли это быть хорошим компромиссом, если механизм, который используется для оптимистической блокировки (поле версии), использовался для пессимистического кеширования, то есть сравнения версии объектов в кеше с БД и перезагрузки их из базы данных при необходимости как только они будут запрошены приложением ... 09.10.2009

  • 2

    Мы успешно использовали PostgreSQL LISTEN / NOTIFY, чтобы поддерживать наши кеши второго уровня (на стороне клиента) в актуальном состоянии. Начиная с PostgreSQL 9.0, NOTIFY также поддерживает указание полезной нагрузки. Мы реализовали его на C ++ и с использованием ODBC, но JPA / JDBC также предоставляют такие возможности.

    Процедура более сложная, но обеспечивает лучшую производительность, чем очистка полного кеша или полное отсутствие кеша, особенно если некоторые отношения обновляются относительно редко.

    Суть процедуры:

    1. Реализация кеширования LISTENs по определенному событию (например, "MYTABLE")
    2. Публикация триггеров вставки / обновления / удаления в MYTABLE записывает изменения (например, метку времени события, код операции и первичный ключ) в таблицу MYTABLE_NY и отправляет уведомление: NOTIFY MYTABLE
    3. Реализация кэша получает уведомление и проверяет последние изменения (например, EVENT_TIMESTAMP > last_cache_refresh) в MYTABLE_NY.
    4. Для каждого события он удаляет данный экземпляр из кеша. В случае, если спящий режим, используя session.evict() или cache.evictEntity()

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

    Если интересно, могу предоставить несколько примеров кода.

    13.11.2013
    Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..