Почему бы не использовать 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
Кратко:
Close()
, вместо этого обертывают Ваши запросы ISession
внутренняя часть using
, оператор или управляет жизненным циклом Вашего ISession где-то в другом месте . От [1 127] документация :
Время от времени эти
ISession
будет выполняться, SQL-операторы должны были синхронизировать состояние соединения ADO.NET с состоянием объектов, сохраненных в памяти. Этот процесс, сброс, происходит по умолчанию в следующих моментах
- от некоторых вызовов
Find()
илиEnumerable()
- от [1 111]
- от [1 112]
, SQL-операторы выпущены в следующем порядке
- все вставки объекта в том же порядке, который соответствующие объекты были сохранены с помощью [1 113]
- все обновления объекта
- все удаления набора
- все удаления элемента набора, обновления и вставки
- все вставки набора
- все удаления объекта, в том же порядке, который соответствующие объекты были удалены с помощью [1 114]
(Исключение - то, что объекты с помощью собственного идентификационного поколения вставляются, когда они сохраняются.)
Кроме тех случаев, когда Вы explicity
Flush()
, нет абсолютно никаких гарантий о том, когда Сессия выполняет вызовы ADO.NET, только порядок, в котором они выполняются . Однако NHibernate действительно гарантирует, что этиISession.Find(..)
методы никогда не будут возвращать устаревшие данные; и при этом они не возвратят неправильные данные.возможно изменить поведение по умолчанию так, чтобы сброс происходил менее часто.
FlushMode
класс определяет три различных режима: только сброс во время фиксации (и только когда NHibernateITransaction
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()
возвраты это к пулу.
Начиная в NHibernate 2.0, транзакции требуются для операций DB. Поэтому эти ITransaction.Commit()
вызов обработает любое необходимое сбрасывание. Если по некоторым причинам Вы не будете использовать транзакции NHibernate, то не будет никакого автосбрасывания сессии.