Как сохранить согласованность данных сеанса NHibernate? - PullRequest
3 голосов
/ 20 сентября 2010

У меня есть сеансы NHibernate, кэшированные в сеансе ASP.NET.

Я столкнулся с ситуацией, когда пользователь редактировал объект, чтобы он находился в кэше первого уровня в сеансе ISession. Затем другой пользователь отредактировал тот же объект.

На этом этапе пользователь1 все еще видит свою первоначальную версию своих правок, где пользователь 2 видит правильное состояние объекта?

Как правильно обрабатывать это без ручного вызова session.Refresh (myObj) явно для каждого отдельного объекта все время?

У меня также включен кэш 2-го уровня. Для NHibernate Long Session я должен просто полностью отключить кэш первого уровня?

Редактировать: Добавление еще некоторой терминологии к тому, чего я хочу достичь с 10.4.1. Длинный сеанс с автоматическим версионированием , конец этого раздела заканчивается

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

Я не уверен, что это за документация, чтобы включить и то, и другое, а потом сразу сказать, что на сессии будут устаревшие данные (именно это я и вижу). Какое здесь решение или нет?

Ответы [ 3 ]

3 голосов
/ 20 сентября 2010

Просто используйте IStatelessSession вместо ISession.

Также имейте в виду, что NH не был предназначен для использования с долгоживущими ISessions (как уже упоминалось другими). Одна проблема в том, что вы уже упоминали. Другая причина заключается в том, что производительность значительно падает, когда NH отслеживает большой граф объектов. Обе проблемы можно избежать с помощью IStatelesSession. Он дает вам отдельные объекты, которые не отслеживаются NH.

Не уверен насчет причин сохранения сеансов в сеансе ASP.NET. Может быть, вы могли бы предоставить некоторые детали?

Также помните, что сеанс является оберткой над IDbConnection. Если он остается открытым, это может привести к голоданию в соединительном бассейне.

3 голосов
/ 20 сентября 2010
0 голосов
/ 28 марта 2011

По-видимому, это известный недостаток NHibernate, подробно описанный в документации, приведенной в моем вопросе.

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