Управление транзакциями NHibernate в ASP.NET MVC - как это сделать? - PullRequest
7 голосов
/ 06 апреля 2010

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

Когда я поместил все транзакции в свои методы репозитория, по некоторым неясным причинам я получил предупреждение «неявные транзакции» в NHProf (операторы SQL выполнялись вне транзакции, даже в коде session.Save () / Update () Методы / etc были вызваны в транзакции с использованием области действия и до вызова транзакции. Кстати, неявные транзакции действительно плохи?

Ответы [ 3 ]

4 голосов
/ 06 апреля 2010

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

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

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

4 голосов
/ 06 апреля 2010

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

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

3 голосов
/ 06 апреля 2010

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

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

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

...