NHibernate медленно при чтении большой сумки - PullRequest
3 голосов
/ 11 июля 2011

У меня проблемы с производительностью, когда в агрегате есть пакет с большим количеством объектов (1000+). Обычно он содержит не более 50 сущностей, но иногда намного больше.

Использование профилировщика NHibernate Я вижу, что длительность извлечения 1123 записей этой сумки из базы данных составляет 18 мс, но для ее обработки требуется NHibernate 1079 мс. Проблема здесь в том, что все эти 1123 записи имеют одну или две дополнительные записи. Я выбираю их, используя fetch = "subselect", а для извлечения этих дополнительных записей требуется 16 мс для выборки из базы данных и 2527 мс для обработки NHibernate. Таким образом, одно это действие занимает 3,5 секунды, что слишком дорого.

Я читал, что это связано с тем, что проблема заключается в обновлении кэша 1-го уровня, поскольку при загрузке большого количества объектов производительность снижается. Но что много? NHibernate Profiler говорит, что у меня 1145 сущностей, загруженных 31 запросом (что в моем случае является абсолютным минимумом). Это количество загруженных объектов не кажется мне большим.

В текущем проекте мы используем NHibernate v3.1.0.4000

1 Ответ

2 голосов
/ 11 июля 2011

Согласен, 1000 сущностей не так уж много.Вы уверены, что время не используется ни одним из конструкторов или установщиков свойств?Вы можете остановить отладчик во время загрузки, чтобы взять случайную выборку, на которой он тратит время.

Также убедитесь, что вы используете оптимизатор отражения (я думаю, он включен по умолчанию).

Я предполагаю, что вы измеряете время самого запроса.Если вы измеряете всю транзакцию, она наверняка потратит время на очистку сеанса.Избегайте очистки, установив для FlushMode значение Never (только если в сеансе нет сохраняемых изменений) или с помощью StatelessSession.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...