Мы (медленно) перемещаем приложение (с классическим ADO.NET DAL) в NHibernate (следуя как «шаблону одного сеанса на запрос», так и «шаблону хранилища»).
Приложение, прямо сейчас, находится в гибридном состоянии (я знаю, это ужасно):
некоторые запросы выполняются одноразовыми объектами DAO (которые открывают соединение в своих конструкторах и удаляют его в методе Dispose ());
некоторые запросы выполняются строго типизированными репозиториями (чьи методы Get (), Save (), Update () и Delete () всегда начинают новую транзакцию - следуя этому предложению http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions - или присоединиться к существующей транзакции).
... и запросы, сделанные объектами DAO, очень медленные (в два раза медленнее, чем раньше).
Ранее у нас была проблема с блокировками базы данных (см. Разве шаблон NHibernate "один сеанс на запрос" немного опасен для длинных веб-запросов? ), и мы решили открыть несколько транзакций только при необходимости и закрывая их как можно скорее (не только в конце текущего веб-запроса). Итак, прямо сейчас наша реализация NHIbernate следует шаблону «один сеанс на запрос», но с «несколькими транзакциями на запрос».
Но проблема со скоростью остается. Единственный способ добиться такой же скорости, как и раньше, - полностью отключить транзакции NHibernate.
Как вы думаете, что может быть причиной? Транзакция NHibernate не используется старыми соединениями ADO.NET? Что нам делать?