NHibernate Flush - как это работает?

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

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

20
задан Graviton 23 April 2009 в 08:15
поделиться

2 ответа

Во многих случаях вам не нужно заботиться о сбрасывании NHibernate.

Вам нужно вызывать flush только в том случае, если вы создали свое собственное соединение , потому что NHibernate не знает, когда вы совершаете его.

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

NHibernate сбрасывает, если

  • вы вызываете commit
  • перед запросами, чтобы обеспечить фильтрацию по фактическому состоянию в памяти
  • при вызове flush

Пример:

using (session = factory.CreateSession())
using (session.BeginTransaction())
{
  var entity = session.Get<Entity>(2);
  entity.Name = "new name";

  // there is no update. NHibernate flushes the changes.

  session.Transaction.Commit();
  session.Close();
}

Объект обновляется при коммите. NHibernate видит, что ваш сеанс грязный, и сбрасывает изменения в базу данных. Вам нужно обновлять и сохранять, только если вы внесли изменения вне сеанса. (Это означает, что с отсоединенной сущностью, которая является сущностью, неизвестной сеансу).


Замечания по производительности: Flush не только выполняет требуемые операторы SQL для обновления базы данных. Он также ищет изменения в памяти. Поскольку в POCO нет грязного флага, необходимо сравнить каждое свойство каждого объекта в сеансе с его кэшем первого уровня. Это может стать проблемой производительности, когда это делается слишком часто. Есть несколько вещей, которые вы можете сделать, чтобы избежать проблем с производительностью:

  • Не сбрасывать циклы
  • Избегать сериализованных объектов (сериализация необходима для проверки изменений)
  • Использовать объекты только для чтения , когда это необходимо
  • Установить mutable = false при необходимости
  • При использовании пользовательских типов в свойствах реализуйте эффективные методы Equals
  • Осторожно отключите автоматическую очистку, когда вы уверены, что знаете, что делаете.
28
ответ дан 30 November 2019 в 00:19
поделиться

NHibernate будет выполнять операторы SQL только тогда, когда это необходимо. Это откладывает выполнение операторов SQL на максимально возможное время.

Например, когда вы сохраняете сущность, у которой есть назначенный идентификатор, она, скорее всего, откладывает выполнение оператора INSERT. Однако, когда вы вставляете сущность, которая имеет идентификатор автоинкремента, например, тогда NHibernate должен ВСТАВИТЬ сущность непосредственно, так как он должен знать идентификатор, который будет назначен этой сущности.

Когда вы явно вызываете flush, затем NHibernate выполнит операторы SQL, необходимые для объектов, которые были изменены / созданы / удалены в этом сеансе.

Flush

6
ответ дан 30 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: