NHibernate - получение большого количества данных становится экспоненциально медленным - PullRequest
1 голос
/ 22 декабря 2010

У меня есть проблема, когда я получаю много данных в NHibernate (например, при создании отчета), страница становится экспоненциально медленнее, чем больше данных она должна извлечь. Я нашел следующую статью:

http://nhforge.org/blogs/nhibernate/archive/2008/10/30/bulk-data-operations-with-nhibernate-s-stateless-sessions.aspx

Это объясняет, как выполнение массовых операций с данными в NHibernate происходит медленно, поскольку кэш первого уровня становится слишком большим, и как вместо этого следует использовать IStatelessSession. Проблема в том, что я не хочу связывать свое приложение с NHibernate, поэтому я добавил оболочку для ISession. Затем я использую Linq в качестве механизма запросов, но IStatelessSession не поддерживает Linq (это может быть в NHibernate 3, но поставщик Linq нестабилен в его текущем состоянии).

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

Я полностью потерян на том, что делаю сейчас. Мне нравится простота создания отчетов с помощью linq, но ограничения встроенного поставщика linq в NHibernate, похоже, сдерживают меня.

Я бы очень признателен, если бы кто-нибудь показал мне альтернативный подход. Спасибо

1 Ответ

4 голосов
/ 22 декабря 2010

Я почти уверен, что это не поддерживается методами ICriteria или Linq;однако, вы можете рассмотреть возможность использования именованных запросов hql для этого.Установка атрибута "read-only" в сопоставлении предотвратит отслеживание сущностей в сеансе.Дополнительную информацию можно найти здесь .

Поскольку это относится к вашему использованию, я бы не стал беспокоиться о том, что не могу сделать все в контексте linq-to-nhibernate.Хотя это отлично подходит для обработки большинства сценариев, специализированные способы использования, такие как создание отчетов, часто лучше оставить таким методам, как hql или даже собственный sql.Не бойтесь иметь несколько .GetEntitySummaryReport() методов в своих репозиториях, это не конец света.

Обновление :

Если добавление методов в вашрепозиторий чувствует себя неправильно , я бы посоветовал взглянуть на использование расширенного объекта запроса , который предоставляет отличный способ инкапсулировать специализированный запрос в зависимости от поставщика.

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