Подтвердить что ты не робот

NHibernate Profiler - большое расхождение между продолжительностью базы данных и общей продолжительностью?

У меня есть приложение, которое широко использует NHibernate. Я начал использовать NHibernate Profiler для определения возможных проблем с производительностью. Мой вопрос связан со статистикой продолжительности запросов.

Стат разбит на "Длительность базы данных" и "Общая продолжительность". Из того, что я читал, цифры должны быть очень близкими. Тем не менее, я вижу относительно большие различия, и я пытаюсь выяснить их источник. Здесь некоторые данные

alt text

Любая идея о том, где я могу исправить эти проблемы?

4b9b3361

Ответ 1

Используется ли ваше приложение с помощью log4net? Если это так, вы должны проверить свою конфигурацию log4net и отключить объем данных, которые вы регистрируете из NHibernate.

Пример из проекта, над которым я сейчас работаю: для запроса, возвращающего 60 строк/объектов, запись всех сообщений журнала NHibernate на уровне DEBUG в файл увеличивает общую продолжительность NHProf от 8 мс до 8000 мсек!

Пример конфигурации для ограничения выхода NHibernate:

<root>
    <level value="ALL" />
    <appender-ref ref="console" />
    <appender-ref ref="trace" />
</root>

<logger name="NHibernate">
    <level value="WARN" />
</logger>

ЕСЛИ это не решит вашу проблему, возможно, вы можете использовать инструмент профилирования производительности, такой как dotTrace или ANTS Profiler, чтобы определить потенциальные узкие места в вашем коде. Это даст вам четкое представление о том, какие методы в вашем коде /NHibernate занимают много времени.

Ответ 2

Привет, я не думаю, что вы смотрите в нужное место. Вы не должны смотреть на продолжительность базы данных и т.д. Вы не можете много сделать с выполнением, когда оно достигнет дБ lvl.

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

И на какой платформе вы работаете, я мог бы предложить вам более эффективные инструменты для идентификации бутылки в вашем приложении.

Надеюсь, что это поможет.

Ответ 3

Я не знаю этого факта, но я всегда предполагал, что общая продолжительность добавляет все служебные данные NHibernate для построения SQL-запроса и при извлечении данных, строящих объекты с необработанными данными.

Возможно, процесс строительства с вашими сущностями очень медленный? У вас есть обширная обработка в конструкторах ваших объектов? любые операции ввода-вывода, ведение журнала, дополнительный доступ к БД, использование сети...

Удачи.

Ответ 4

Первый результат - это время, необходимое для выполнения и получения результата из БД. Второй результат - это время, которое требуется NHibernate для загрузки соответствующих объектов в памяти.

Im работает в проекте прямо сейчас, который использует очень большой объект (почти 100 столбцов/полей). Если я попытаюсь загрузить пару тысяч, это также займет несколько секунд. Однако sql-запрос возвращает список идентификаторов сущностей за несколько миллисекунд. Но чтобы фактически загрузить эти идентификаторы в соответствующие объекты, генерирует дополнительные служебные данные, если ваши объекты являются большими или сложными объектами (см. Выше).

Вы получаете предупреждения для сгенерированных запросов? Столбец рядом с Duration в NHibernate Profiler.

С уважением,
Маттиас