Управление сессией NHibernate в длительной операции - PullRequest
4 голосов
/ 05 января 2010

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

В этом случае класс, координирующий работу (загрузка объектов а затем отправка их в определенные классы для обработки) необходимо быть в состоянии иметь мелкозернистый контроль над сессией. я созерцая уничтожение и создание нового сеанса для каждого объекта это должно быть обработано. Или, может быть, есть что-то вроде вызывая session.Clear () каждый раз, чтобы уничтожить все? Другой что мне нужно, это возможность уничтожить и воссоздать сеанс, если исключение происходит. Каждый объект представляет собой транзакцию, в которой все бизнес-логика для этого объекта должна быть успешной или неудачной. Если это не удается, Мне нужно откатить, уничтожить сеанс, создать новый, а затем перейти к следующему объекту.

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

Ответы [ 2 ]

1 голос
/ 05 января 2010

Хорошо иметь несколько транзакций (по одной за раз) внутри сеанса IS, поэтому нет необходимости создавать новый сеанс, если вам нужно откатить транзакцию. ISession обычно лучше всего использовать для представления одной единицы работы, но я думаю, что это особый случай.

Вы измерили использование памяти? Для ISession не так уж необычно отслеживать десятки тысяч объектов, если граф объектов полностью загружен для набора бизнес-объектов. Подумайте о загрузке всех заказов на продажу и связанных данных для нескольких клиентов.

Наилучшей возможной производительностью с NHibernate было бы использование IStatelessSession в массовых операциях. Согласно этой статье , сеанс без сохранения состояния сократил время выполнения на ~ 50% при операции с 500 000 объектов. Это заставляет меня предположить, что вам не следует оптимизировать, пока у вас не будет ~ 100 000 объектов.

Я думаю, что любое решение - одно или несколько сеансов IS - будет работать нормально, и я не буду пытаться оптимизировать его, если у меня не будет проблемы измеримой производительности.

0 голосов
/ 05 января 2010

Один ISession экземпляр на объект будет соответствовать модели здесь. Сеансы рассчитаны на единицу работы, что у вас есть в случае с каждой сущностью, а не сессия «на вызов», как вы говорите.

Если возникает исключение, просто запустите процесс снова для этого объекта с новым экземпляром ISession.

Вы должны быть в состоянии использовать свой существующий код, который я бы подумал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...