Когда я вставляю / обновляю в связанной таблице, как это влияет на производительность моего приложения?
Hibernate имеет два высокоуровневых режима работы: с состоянием и без состояния.
Когда Hibernate работает в режиме Stateful (например, Session
not StatelessSession
), он всегда собирает операции объекта в очередь действий.Позже эта очередь действий используется для управления системой событий, которая не только заставляет Hiberante выполнить SQL для этих операций, но также уведомляет интеграторов об этих операциях сущностей.
Очередь действий имеет в виду множество целей,Но когда дело доходит до производительности, это позволяет Hibernate собирать эти операции и откладывать операции с базой данных, чтобы свести к минимуму получение и использование соединений и чтобы потенциально можно было выполнять операции с базой данных.
Будет ли клиентнужно ждать завершения всех проверок?Envers обрабатывает это в отдельном потоке?
Да, клиенту придется ждать, пока Envers будет работать на той же границе потока, что и ваш Session
.
И как тольковставка прошла успешно, тогда клиент сможет продолжить выполнение любой задачи, которую он делал?Или же весь этот аудит будет обрабатываться в одном потоке, и клиентскому приложению придется ждать завершения всех записей аудита?
Envers поддерживает очередь действий, аналогичную Hibernate.Когда Hibernate очищает свою очередь действий и запускает события, Envers будет уведомлен об этих событиях и создаст свою собственную очередь действий.
Основное различие между очередью действий Envers и Hibernate состоит в том, что, поскольку Envers является средой аудита во время фиксации, его очередь действий не может быть сброшена вручную.Очередь действий аудита будет автоматически очищена непосредственно перед тем, как подтверждение транзакции будет отправлено в базу данных в первую очередь для всех транзакций из Hibernate.
Так что да, это все однопоточные.
Envers кеширует всю аудиторскую обработку и выполняет ее позже?Я имею в виду после того, как все записи были завершены.
Да, как я описал выше, но я проиллюстрирую здесь.Предположим, у нас есть открытый сеанс и активная транзакция, с которой мы работаем в клиенте:
// User code calls save on some entity objects
// after these operations, some action queue entries are generated
// No SQL has been executed
// No Audit operations have been executed or generated
session.save( someEntity1 );
session.save( someEntity2 );
// Lets say we manually flush Hibernate
// This flushes the Hibernate action queue
// SQL statements get fired for the above 2 saves
// Events are fired for integrators for the 2 save operations
// Envers generates AuditWorkUnit entries in its action queue for the operations
session.flush();
// User code calls save on another entity
// after these operations, some action queue entries are generated
// No SQL has been executed for this
// No Audit operations have been executed or generated
session.save( someEntity3 );
// commit the transaction
// This flueshes the Hibernate action queue
// sQL statements get fired for the above save of someEntity3
// Events are fired for integrators for the 1 save operation
// Envers generates AuditWorkUnit entries in its action queue for the operation
// pre-commit operations fire:
// * Envers iterates its AuditWorkUnit action queue and executes those
// * This generates Audit table SQL operations
// Transaction gets committed if no errors
session.getTransaction().commit();
Как насчет управления транзакциями.Допустим, я успешно создал запись для сущности Person, но при попытке создать записи аудита произошла ошибка.Что будет потом?Будет ли откат записи данных сущности Person?
Транзакция будет помечена для отката;следовательно, никакие данные не будут сохранены для Person
или эквивалентного ему аудита в схеме аудита.
Как насчет среды распределенных транзакций?Как бы вы убедились в согласованности записей аудита Envers в среде распределенных транзакций?Вы когда-нибудь были в подобной ситуации, и как вы решили свои проблемы, если таковые имеются?
Это не относится;позвольте мне объяснить.
Сам Envers супер упрощен.Те события, о которых я упоминал ранее, приводят к созданию ряда HQL-инструкций и их передаче в Hibernate для выполнения;ничего особенного там нет.
Это означает то же самое Session
и Transaction
, с которыми вы взаимодействовали в пользовательском коде вашего клиента для отправки операций в Hibernate, то же самое, с которым взаимодействует Envers, чтобы делать точно то же самое.
Поэтому, если по какой-либо причине эта распределенная транзакция помечается для отката, откатывается не только ваши данные * 1056, но и сами операции Envers.Распределена транзакция или нет, не имеет отношения к интеграции между Hibernate и Envers.