Задержка NHibernate очень высока - PullRequest
5 голосов
/ 01 февраля 2010

Я использую NHibernate для ORM и объединил загрузку множества сущностей в один большой запрос.

Я загружаю словарь слов, около 500 тыс. Записей, и каждое слово относится к другим. Запуск процесса загрузки в фоновом режиме может быть очень сложным в нашем приложении, так как нам придется вручную загружать запись, которая не была загружена вовремя, поскольку любое слово может быть запрошено в любое время. Наши единственные требования - чтобы все данные загружались как можно быстрее. Я также попытался использовать сеанс без сохранения состояния, но получил исключение, что сеансы без сохранения состояния не могут извлекать коллекции (по какой-то причине, возможно, это связано с тем, что для сеансов без сохранения состояния не существует кэша?)

Проблема в том, что, хотя запрос занимает в SQLServer не более 25 секунд, для ICriteria.List () это занимает более 3 минут.

Я использовал NHProf для профилирования процесса загрузки и обнаружил, что создание сущностей является дорогостоящим делом, которое занимает большую часть времени загрузки в NHibernate.

Могу ли я что-нибудь сделать, чтобы уменьшить эту задержку? Это дорогое выделение памяти или «заполнение» данных?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 01 февраля 2010

Возможно, вам следует учитывать тот факт, что NHibernate (как и большинство ORM) не особенно подходит (или предназначен) для этих типов сценариев массовой загрузки.Сколько строк вы пытаетесь загрузить, отдать или взять?Что ты пытаешься сделать?Предварительно заполнить кеш?Есть ли пакетная обработка?

Мне кажется, что вы должны серьезно задуматься о назначении своего приложения и соответственно выбрать базовые технологии.Возможно, вы можете пролить свет на ваши намерения / требования?

РЕДАКТИРОВАТЬ ОК, из ваших комментариев я понимаю, что вы пытаетесь сделать здесь.Первое, что я хотел бы сделать, это создать простой прототип, используя сырой ADO.NET для загрузки тех же данных, чтобы почувствовать наилучшую производительность, достижимую при использовании стандартного доступа к данным и коллекций в памяти.Затем возитесь с различными типами коллекций, чтобы увидеть, что хорошо работает при заполнении и поиске.Если загрузка данных, таких как эта, все еще слишком медленная, пришло время начать искать другие способы загрузки данных: на основе файла из локального файла данных, увлажнение предварительно сериализованных объектов, некоторая форма быстрой загрузки по требованию и т. Д.1005 *

3 голосов
/ 02 февраля 2010

Загрузка 500 000 объектов в сеанс NHibernate не очень хорошая идея. Сессия сделана недолгой и содержит относительно небольшое количество объектов.

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

Более подробную информацию о StatelessSession можно найти в этой статье и в документации NH на nhibernate.info.

В этом сценарии я бы также рекомендовал вам использовать прямую ADO.NET вместо NHibernate. Я не говорю, что вам следует полностью изменить стратегию доступа к данным на ADO.NET, но вы можете рассмотреть возможность использования ADO.NET для пакетных операций и использования NHibernate для других случаев.

0 голосов
/ 01 февраля 2010

Профилирование процесса создания (например, с помощью анализатора производительности VS) должно точно сказать, сколько стоит операция.Если вы уже играли с настройкой отложенной загрузки, то я думаю, что единственное хорошее решение - это инкапсулировать возвращаемый список, чтобы включить разбиение на страницы меньших порций за несколько итераций.Я не уверен, поддерживает ли NHibernate ленивые списки результатов, как JPA (т.е. не загружает объекты из считывателя данных до тех пор, пока это не потребуется).

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