Сброс NHibernate ISession: Где и когда использовать его, и почему?

Почему бы не использовать STL: vector? Так просто, и вам не нужно удалять вектор.

int rows = 100;
int cols = 200;
vector< vector<int> > f(rows, vector<int>(cols));
f[rows - 1][cols - 1] = 0; // use it like arrays
185
задан geo 9 September 2015 в 22:39
поделиться

2 ответа

Кратко:

  1. Всегда транзакции использования
  2. не используют Close(), вместо этого обертывают Ваши запросы ISession внутренняя часть using, оператор или управляет жизненным циклом Вашего ISession где-то в другом месте .

От [1 127] документация :

Время от времени эти ISession будет выполняться, SQL-операторы должны были синхронизировать состояние соединения ADO.NET с состоянием объектов, сохраненных в памяти. Этот процесс, сброс, происходит по умолчанию в следующих моментах

  • от некоторых вызовов Find() или Enumerable()
  • от [1 111]
  • от [1 112]

, SQL-операторы выпущены в следующем порядке

  1. все вставки объекта в том же порядке, который соответствующие объекты были сохранены с помощью [1 113]
  2. все обновления объекта
  3. все удаления набора
  4. все удаления элемента набора, обновления и вставки
  5. все вставки набора
  6. все удаления объекта, в том же порядке, который соответствующие объекты были удалены с помощью [1 114]

(Исключение - то, что объекты с помощью собственного идентификационного поколения вставляются, когда они сохраняются.)

Кроме тех случаев, когда Вы explicity Flush(), нет абсолютно никаких гарантий о том, когда Сессия выполняет вызовы ADO.NET, только порядок, в котором они выполняются . Однако NHibernate действительно гарантирует, что эти ISession.Find(..) методы никогда не будут возвращать устаревшие данные; и при этом они не возвратят неправильные данные.

возможно изменить поведение по умолчанию так, чтобы сброс происходил менее часто. FlushMode класс определяет три различных режима: только сброс во время фиксации (и только когда NHibernate ITransaction API используется), сброс автоматически с помощью объясненной стандартной программы, или никогда не сбрасывает, если Flush() не назван явно. Последний режим полезен для длительных единиц работы, где ISession сохранен открытым и разъединенным в течение долгого времени.

...

Также относятся к [1 128] этот раздел :

Окончание сессии включает четыре отличных фазы:

  • сбрасывают сессию
  • , фиксируют транзакцию
  • , закрыли сеанс
  • , обрабатывают исключения

Сбрасывание Сессии

, Если Вы, оказывается, используете ITransaction API, Вы не должны волноваться об этом шаге. Это будет выполнено неявно, когда транзакция будет фиксироваться. Иначе необходимо звонить ISession.Flush(), чтобы гарантировать, что все изменения синхронизируются с базой данных.

Фиксация транзакции базы данных

при использовании API NHibernate ITransaction это похоже:

tx.Commit(); // flush the session and commit the transaction

при управлении транзакциями ADO.NET сами Вы должны вручную Commit() транзакция ADO.NET.

sess.Flush();
currentTransaction.Commit();

, Если Вы решаете не фиксировать свои изменения:

tx.Rollback();  // rollback the transaction

или:

currentTransaction.Rollback();

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

Закрытие ISession

А звонят в [1 124] метки конец сессии. Основная импликация Завершения () - то, что соединение ADO.NET будет оставлено сессией.

tx.Commit();
sess.Close();

sess.Flush();
currentTransaction.Commit();
sess.Close();

, Если Вы обеспечили свое собственное соединение, Close() возвраты ссылка на него, таким образом, можно вручную закрыть его или возвратить его пулу. Иначе Close() возвраты это к пулу.

234
ответ дан ssarabando 23 November 2019 в 05:54
поделиться

Начиная в NHibernate 2.0, транзакции требуются для операций DB. Поэтому эти ITransaction.Commit() вызов обработает любое необходимое сбрасывание. Если по некоторым причинам Вы не будете использовать транзакции NHibernate, то не будет никакого автосбрасывания сессии.

14
ответ дан Sean Carpenter 23 November 2019 в 05:54
поделиться
Другие вопросы по тегам:

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