Я пишу простому ASP.NET MVC использование сессии на запрос и транзакции на шаблоны запроса (пользовательский HttpModule). Это, кажется, работает правильно, но.. производительность ужасна (простая страница загружает ~7 секунд). Для каждого запроса HTTP графические ресурсы incuding (все изображения на сайте) создается транзакция, и это, кажется, задерживается, загружающиеся времена (без транзакций, загружающих времена на одно изображение, ~1-10 мс с транзакциями, они - более чем 1 секунда). Что надлежащий путь состоит в том, чтобы справиться с транзакциями в стеке ASP.NET MVC + NH?
Когда я поместил все транзакции в свои методы репозитория, по некоторым неясным причинам я получил 'неявные транзакции', предупреждающие в NHProf (SQL-операторы выполнялись вне транзакции, даже это на сессии кода. Сохраните () / Обновление () / и т.д., методы были вызваны в рамках транзакции с помощью объема и перед транзакцией. Фиксация () вызов), BTW являются неявными транзакциями действительно плохо?
Вам нужно использовать контекстный сеанс, чтобы новый сеанс и транзакция не создавались при каждом запросе ресурса изображения и т. д. См. мой ответ на этот вопрос . Это изменение должно значительно улучшить производительность. Вероятно, это также основная причина неявных предупреждений о транзакциях.
Другой частой проблемой производительности приложений NH является использование log4net с уровнем DEBUG.
Edit: Ответы Мин и Кевин Панг также являются хорошим советом, поэтому я не буду утруждать себя повторением их утверждений.
Здесь есть пара проблем:
Во-первых, относительно вашего проблемы с производительностью. Вы уверены, что экземпляр ISessionFactory создается только один раз? Это очень дорогостоящий объект для создания, поэтому он, вероятно, должен быть синглтоном в вашем веб-приложении, который создается в Application_Start, а не в Application_BeginRequest. Я предполагаю, почему вы получаете такую низкую производительность, потому что вы создаете новую ISessionFactory для каждого запроса, а не один раз для всего приложения.
Во-вторых, что касается неявных транзакций, они не так плохи, но, судя по тому, как вы описываете свой код, вы не должны получать эти ошибки. Вы уверены, что выполняете звонки в рамках транзакции? Возможно, вы обращаетесь к некоторым свойствам отложенной загрузки со страниц .aspx и .ascx, которые могут выполняться вне вашей транзакции.
Неявные транзакции возникают, когда вы не помещаете свои операторы в транзакцию. Подразумевается, что если вы явно не объявляете транзакцию, каждый из ваших операторов запускается в своей собственной транзакции. Так что да, это плохо. Это плохо ? Я недостаточно знаю, над чем вы работаете, чтобы судить.
Я делаю то же самое, что и вы с сеансом на запрос, но я не могу приблизиться к тем же показателям производительности. Я бы порекомендовал включить log4net для NHibernate и посмотреть, что он делает. Ваше приложение должно создавать фабрику сеансов и фабрики прокси только один раз (управление фабрикой сеансов было бы одним из немногих мест, где я бы использовал синглтон). Это действительно единственное, о чем я могу думать, что могло бы его вызвать.