WedX - журнал о программировании и компьютерных науках

Какова точная цель флеша в JPA

Некоторое запутанное объяснение: flush(); Очистка — это процесс синхронизации базового постоянного хранилища с сохраняемым состоянием, хранящимся в памяти. Он будет обновлять или вставлять в ваши таблицы в текущей транзакции, но может не фиксировать эти изменения.

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

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

20.08.2015


Ответы:


1

Теоретически вы (как пользователь JPA) никогда (или в абсолютно редких случаях) не должны попадать в ситуации, когда нужно вызывать flush().

Очистка — это процесс синхронизации базового постоянного хранилища с сохраняемым состоянием, хранящимся в памяти.

Другими словами, в flush() все операторы вставки, обновления, удаления или любые другие операторы фактически вызываются в базе данных, до flush() в вашей базе данных ничего не происходит. Сброс вызван фиксацией вашей транзакции или некоторыми видами чтения базы данных. Например, если вы выполняете запрос JPQL, необходимо выполнить flush(), чтобы получить правильные результаты из базы данных. Но это очень приятно знать, и это полностью обрабатывается вашей реализацией JPA.

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

Изменить, чтобы ответить на вопросы в комментарии:

Не при каждом чтении требуется сброс, рассмотрим этот сценарий (одна транзакция):

  1. Читать человека Person p = em.find(Person.class, 234)
  2. Обновить человека p.setAge(31)
  3. Читать здание Building b = em.find(Building.class, 123
  4. Чтение здания с запросом JPQL select b from Building b where b.id = 123

Автоматический flush происходит только до 4., потому что Eclipselink не может определить, что вы собираетесь читать, поэтому возраст человека должен быть актуальным в базе данных, прежде чем это чтение может произойти. До 3. сброс не требуется, потому что Eclipselink знает, что обновление на человеке не может повлиять на здание.

Чтобы работать с оптимистической блокировкой, вы должны ее реализовать. Прочитайте об аннотации @Version здесь: https://blogs.oracle.com/carolmcdonald/entry/jpaflush()0_concurrency_and< /а>. Без этого ваша сущность не будет использовать оптимистическую блокировку, и «выигрывает последнее обновление».

20.08.2015
  • Итак, если я прочитаю базу данных, будет ли сброс вызываться перед автоматическим чтением? 20.08.2015
  • И еще один небольшой вопрос: если один поток сбрасывает некоторые данные об объекте, а другой поток вносит в них какие-то изменения и выполняет сброс в своей собственной транзакции, будет ли он вызывать оптимистическую блокировку, мне просто интересно, потому что, как вы сказали, сбрасывается данные изолированы только для транзакции, не видимой для других. Так может ли другой поток вызвать оптимистическую блокировку? 20.08.2015
  • Я ответил на ваши вопросы в своем ответе выше, но задайте новый конкретный вопрос о SO, а не расширяйте его, это может быть бесполезно для других. 20.08.2015

  • 2

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

    20.08.2015
  • Но когда я делаю сброс, я не вижу обновленных данных в базе данных. В некоторых руководствах и некоторых вопросах по SO упоминается, что при сбросе данные перемещаются только в кеш второго уровня. Я не знаю, что это значит, но, поскольку данных нет в базе данных, я не знаю, так ли это полезно для пользователя. 20.08.2015
  • Насколько я помню, это тот же метод очистки, который также используется менеджером сущностей. Если обновление не отражается в базе данных, во время процесса фиксации должно быть создано исключение. Это может быть какой-то несинхронизированный контекст сохранения после серии событий транзакции. 20.08.2015
  • @NickDiv Простой пример: сохранить -› память / сбросить -› базу данных (изолированную, не видимую для других) / фиксировать -› базу данных ( виден другим). Читайте о транзакциях базы данных. 20.08.2015
  • Если вы подозреваете, что проблема связана с кэшированием, попробуйте отключить кэширование с помощью файла конфигурации persistence.xml. Установите shared-cache-mode на NONE 20.08.2015
  • @OwenBringino Большое спасибо за ответ. Кэш вроде не при чем. И исключения тоже не выбрасываются. Я не знаю, почему я не вижу данные в БД. Можно ли откатить сброшенные данные? 20.08.2015
  • @MathiasBegert Большое спасибо, ваше объяснение имеет большой смысл. Просто и эффективно :-) Не знаю, почему я не вижу данных в БД. Можно ли откатить сброшенные данные? 20.08.2015
  • @NickDiv Вы пытались проверить данные во время процесса, используя другой сеанс БД? 12.10.2018
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]