Отображение NHibernate очень медленно - PullRequest
1 голос
/ 28 января 2012

Я использую nhibernate, чтобы создать коллекцию неизменяемых доменных объектов из устаревшей базы данных Oracle.простой поиск с использованием Criteria api займет более 60 секунд.Если последующие поиски одного и того же поиска очень быстрые, обычно менее 300 мс (100 мс в дБ и покоя по nhibernate, У меня нет двухуровневого кэша или кеш запросов включен , все запросы делаютиди в БД я проверял с помощью nhibernate prof).Однако, если я оставляю приложение бездействующим в течение пары минут и снова запускаю поиск, это занимает обычно 50-60 секунд,

Я использовал профилировщик nhibernate, и в каждом случае его отчетливо показывается только самое большее 100 мс.в базе данных, я полагаю, что остальное время должно быть занято nhibernate, я не могу понять, почему?

Некоторая справочная информация:

  1. Я использую динамический компонент для сопоставления 20столбцы в пары ключ-значение.
  2. Использование nhibernate 2.1
  3. Я использую динамический компонент в отображении

  4. После получения данные никогда не изменяются, в отображении яЯ использую флаг mutable = false.

  5. это устаревшая база данных, поэтому я использую составной ключ в отображении.
  6. Я получаю только около 50 объектов в каждом поиске

  7. Когда я открываю сеанс, я установил FlushMode = Никогда

  8. Я также пробовал сеанс без сохранения состояния (при первоначальном поиске производительность по-прежнему низкая)
  9. Я не определяю и не использую какие-либо пользовательские типы в отображении

Я явно что-то делаю не так или что-то упустил, есть идеи?

Ответы [ 3 ]

2 голосов
/ 29 января 2012

Я предлагаю загрузить профилировщик производительности C #, такой как dotTrace. Вы сможете быстро получить более точное представление о том, где ваша проблема с производительностью. Я почти уверен, что это не проблема сопоставления NHibernate.

1 голос
/ 29 января 2012

Как управляется время жизни вашей SessionFactory? Возможно ли, что ваша SessionFactory удаляется после некоторого периода бездействия?

1 голос
/ 29 января 2012

Скорее всего, это не проблема Nhibernate.

  1. Используйте приведенный ниже код, чтобы выяснить, сколько времени потребуется, чтобы вернуть ваши данные.(db + network_latency + nhibernate_execution)
  2. Если вы уверены, что задержка не связана с APP, проверьте базу данных, просмотрев кэширование плана запроса и кэширование результатов запроса.При первом запуске запроса из-за отсутствия кэша ваша БД будет инвестировать в трудоемкие и интенсивные операции для генерации набора результатов.
  3. Если 1 и 2 не дают полезной информации, проверьте свою сеть.Возможно, некоторое сетевое давление приводит к большой задержке.
  4. Как упомянуто JeffreyABecker ниже, изучите, как ваши фабрики сеансов удаляются / создаются.Найдите использование ISessionFactory.Dispose() или configuration.BuildSessionFactory().Создание объектов ISessionFactory является дорогостоящей операцией, и, как правило, вы должны создавать их при запуске приложения и располагать их при остановке / завершении работы приложения.60s> это все еще звуковое число для создания экземпляра ISessionFactory.
    //Codez<br>
    Stopwatch stopwatch = new Stopwatch();

    // Begin timing
    stopwatch.Start();

    // Nhibernate specific stuff ONLY in here
    // Depending on your setup, do a session.Flush(); if possible.

    // End Timing
    stopwatch.Stop();

    // Write result - console/log4net/diagnostics.debug/etc
    Console.WriteLine("Time elapsed: {0}",stopwatch.Elapsed);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...