На основе ответов в этой теме я создал директиву checklist-model , которая охватывает все случаи:
Для случая с темой-инициатором это будет:
Я бы использовал сеанс для каждого запроса к серверу и одну транзакцию на сеанс. Я бы не стал оптимизировать производительность до того, как приложение станет зрелым.
Ответ на ваши решения:
Было бы бесполезно сейчас вдаваться в подробности, потому что я бы просто повторил руководства / учебные пособия / книгу . Когда вы используете сеанс для каждого запроса, у вас, вероятно, не будет проблем в 99% описываемого приложения (а может быть, и вовсе). Session - это легкий, не потокобезопасный класс, который проживет очень недолго. Если вы хотите точно знать, как работает управление сеансом / подключением / кешированием / транзакциями,
Прочтите « ISessionFactory
» на этой странице документации NHibernate. ISession
должны быть однопоточными (т. Е. Не поточно-ориентированными), что, вероятно, означает, что вы не должны делиться ими между пользователями. ISessionFactory
должен быть создан вашим приложением один раз, а ISession
должны быть созданы для каждой единицы работы. Помните, что создание ISession
s не обязательно приводит к открытию соединения с базой данных. Это зависит от того, как настроена стратегия пула соединений вашего SessionFactory.
Вы также можете посмотреть документацию Hibernate по сеансам и транзакциям .
Я бы старался сохранить все в памяти и либо записывать изменения, либо делать периодические автономные снимки.
Прочтите NHibernate Best Practices с ASP.NET , здесь для начала есть несколько очень хороших советов. Как уже упоминалось, будьте очень осторожны с ISession, так как это НЕ потокобезопасно, так что просто имейте это в виду.
Если вам требуется что-то более сложное, загляните в проект NHibernate.Burrow contrib. . В нем говорится что-то вроде «настоящая сила, которую обеспечивает Burrow, заключается в том, что диалог Burrow может охватывать несколько HTTP-запросов».