Управление транзакциями NHibernate в ASP.NET MVC - как это должно быть сделано?

Я пишу простому ASP.NET MVC использование сессии на запрос и транзакции на шаблоны запроса (пользовательский HttpModule). Это, кажется, работает правильно, но.. производительность ужасна (простая страница загружает ~7 секунд). Для каждого запроса HTTP графические ресурсы incuding (все изображения на сайте) создается транзакция, и это, кажется, задерживается, загружающиеся времена (без транзакций, загружающих времена на одно изображение, ~1-10 мс с транзакциями, они - более чем 1 секунда). Что надлежащий путь состоит в том, чтобы справиться с транзакциями в стеке ASP.NET MVC + NH?

Когда я поместил все транзакции в свои методы репозитория, по некоторым неясным причинам я получил 'неявные транзакции', предупреждающие в NHProf (SQL-операторы выполнялись вне транзакции, даже это на сессии кода. Сохраните () / Обновление () / и т.д., методы были вызваны в рамках транзакции с помощью объема и перед транзакцией. Фиксация () вызов), BTW являются неявными транзакциями действительно плохо?

7
задан DaveRandom 25 February 2013 в 22:12
поделиться

3 ответа

Вам нужно использовать контекстный сеанс, чтобы новый сеанс и транзакция не создавались при каждом запросе ресурса изображения и т. д. См. мой ответ на этот вопрос . Это изменение должно значительно улучшить производительность. Вероятно, это также основная причина неявных предупреждений о транзакциях.

Другой частой проблемой производительности приложений NH является использование log4net с уровнем DEBUG.

Edit: Ответы Мин и Кевин Панг также являются хорошим советом, поэтому я не буду утруждать себя повторением их утверждений.

3
ответ дан 6 December 2019 в 23:03
поделиться

Здесь есть пара проблем:

Во-первых, относительно вашего проблемы с производительностью. Вы уверены, что экземпляр ISessionFactory создается только один раз? Это очень дорогостоящий объект для создания, поэтому он, вероятно, должен быть синглтоном в вашем веб-приложении, который создается в Application_Start, а не в Application_BeginRequest. Я предполагаю, почему вы получаете такую ​​низкую производительность, потому что вы создаете новую ISessionFactory для каждого запроса, а не один раз для всего приложения.

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

4
ответ дан 6 December 2019 в 23:03
поделиться

Неявные транзакции возникают, когда вы не помещаете свои операторы в транзакцию. Подразумевается, что если вы явно не объявляете транзакцию, каждый из ваших операторов запускается в своей собственной транзакции. Так что да, это плохо. Это плохо ? Я недостаточно знаю, над чем вы работаете, чтобы судить.

Я делаю то же самое, что и вы с сеансом на запрос, но я не могу приблизиться к тем же показателям производительности. Я бы порекомендовал включить log4net для NHibernate и посмотреть, что он делает. Ваше приложение должно создавать фабрику сеансов и фабрики прокси только один раз (управление фабрикой сеансов было бы одним из немногих мест, где я бы использовал синглтон). Это действительно единственное, о чем я могу думать, что могло бы его вызвать.

4
ответ дан 6 December 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: