Что лучший способ состоит в том, чтобы улучшить производительность NHibernate?

Если вы хотите, чтобы истинное клонирование было неизвестным, вы можете взглянуть на fastclone .

Это клонирование на основе выражений, работающее примерно в 10 раз быстрее, чем двоичная сериализация и сохранение полного графа объектов целостность.

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

Нет необходимости в интерфейсах, атрибуты или любую другую модификацию клонируемых объектов.

61
задан Ray Vega 25 February 2009 в 18:01
поделиться

11 ответов

Проблема первого и наиболее театрального представления, с которой можно столкнуться с NHibernate, состоит в том при создании новой фабрики сессии для каждой сессии, Вы создаете. Только один экземпляр фабрики сессии должен быть создан для каждого выполнения приложений, и все сессии должны быть созданы той фабрикой.

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

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

, Который приносит нам к нетерпеливой выборке, противоположности ленивой загрузки. При пересечении иерархий объектов или цикличного выполнения через наборы, может быть легко потерять след того, сколько запросов Вы делаете, и Вы заканчиваете с экспоненциальным количеством запросов. Нетерпеливая выборка может быть сделана на на основание запроса с СОЕДИНЕНИЕМ ВЫБОРКИ. При редких обстоятельствах, такой, как будто существует конкретная пара таблиц, Вы всегда выбираете соединение, рассматриваете выключение ленивой загрузки для тех отношений.

Как всегда, SQL Profiler является отличным способом найти запросы, которые отстают или сделаны неоднократно. В моем последнем задании у нас была функция разработки, которая считала запросы на запрос страницы также. Высокое количество запросов для стандартной программы является самым очевидным индикатором, что Ваша стандартная программа не работает хорошо с NHibernate. Если количество запросов на стандартную программу или запрос выглядит хорошим, Вы, вероятно, до настройки базы данных; удостоверяясь у Вас есть достаточно памяти для хранения планов выполнения и данных в кэше, правильно индексируя данные, и т.д.

Одна хитрая небольшая проблема, с которой мы столкнулись, была с SetParameterList (). Функция позволяет Вам легко передавать список параметров к запросу. NHibernate реализовал, это путем создания одного параметра для каждого объекта передало в. Это приводит к различному плану запросов для каждого количества параметров. Наши планы выполнения почти всегда становились выпущенными от кэша. Кроме того, многочисленные параметры могут значительно замедлить запрос. Мы сделали пользовательский взлом NHibernate для отправки объектов как разграниченного списка в единственном параметре. Список был разделен в SQL Server функцией табличного значения, которую наш взлом автоматически вставил в В пункт запроса. Могли быть другие мины как это в зависимости от Вашего приложения. SQL Profiler является лучшим способом найти их.

53
ответ дан Chuck 24 November 2019 в 17:16
поделиться

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

Глава, Улучшающая производительность , описывает это и другие способы улучшить производительность.

1
ответ дан Frédéric 24 November 2019 в 17:16
поделиться

Профилирование является первым шагом - даже простыми синхронизированными модульными тестами - для обнаружения, где самые большие усиления могут быть сделаны

Для наборов, полагают, что установка пакетного размера для сокращения количества избранных сделанных заявлений - видит раздел Улучшающаяся производительность для деталей

1
ответ дан Frédéric 24 November 2019 в 17:16
поделиться

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

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

Ваша цель состоит в том, чтобы определить объекты, к которым постоянно получает доступ Ваше приложение. Среди тех будут общие настройки и т.п..

существует много информации, которая будет найдена для nhibernate второго кэша уровня и как реализовать его.

Удача:)

1
ответ дан Hace 24 November 2019 в 17:16
поделиться

Кэширование, Кэширование, Кэширование - Вы используете свой первый уровень, кэширующийся правильно [закрывший сеансы преждевременно или использующий StatelessSession для обхода первого кэширования уровня]? Необходимо ли настроить простой второй кэш уровня для значений то изменение нечасто? Действительно ли можно ли кэшировать наборы результата запроса для ускорения запросов то изменение нечасто?

[Также конфигурация - можно ли установить объекты как неизменные? Можно ли реструктурировать запросы для возвращения только информации, Вы нуждаетесь и преобразовываете их в исходный объект? Batman будет в состоянии остановить Загадочника, прежде чем он доберется до дамбы?..., о, извините увлекся.]

1
ответ дан Watson 24 November 2019 в 17:16
поделиться

Без любых специфических особенностей о видах проблем производительности Вы видите, я могу только предложить обобщение: По моему опыту, большинство проблем производительности запросов базы данных является результатом отсутствия надлежащих индексов. Таким образом, мое предложение для первого действия должно было бы проверить Ваши планы запросов на неиндексируемые запросы.

4
ответ дан Mike Monette 24 November 2019 в 17:16
поделиться

Нет рекомендация, но инструмент для помощи Вам: NH, который Профессор ( http://nhprof.com/ ), кажется, обещает, это может оценить Ваше использование платформы ORM. Это может быть хорошая начальная точка для Вашей настройки NHibernate.

11
ответ дан MatthieuGD 24 November 2019 в 17:16
поделиться

Избегайте и/или минимизируйте Выбор N + 1 проблема путем распознавания, когда переключиться от ленивой загрузки до нетерпеливой выборки для медленных запросов выполнения.

11
ответ дан Ray Vega 24 November 2019 в 17:16
поделиться

SessionFactory NHIBERNATE является дорогой операцией, таким образом, хорошая стратегия к, создает Singleton, которая гарантирует, что существует ТОЛЬКО ОДИН экземпляр SessionFactory в памяти:

   public class NHibernateSessionManager
    {
        private readonly ISessionFactory _sessionFactory;

        public static readonly NHibernateSessionManager Instance = new NHibernateSessionManager();

        private NHibernateSessionManager()
        {
            if (_sessionFactory == null)
            {
                System.Diagnostics.Debug.WriteLine("Factory was null - creating one");
                _sessionFactory = (new Configuration().Configure().BuildSessionFactory());
            }
        }

        public ISession GetSession()
        {
            return _sessionFactory.OpenSession();
        }

        public void Initialize()
        {
            ISession disposeMe = Instance.GetSession();
        }
    }

Тогда в Вашем Глобальном. Asax Application_Startup, можно инициализировать его:

protected void Application_Start()
{
    NHibernateSessionManager.Instance.Initialize();
}
26
ответ дан David P 24 November 2019 в 17:16
поделиться

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

самая легкая фиксация должна исследовать планы выполнения Ваших запросов и создать надлежащие индексы, особенно на Ваших столбцах внешнего ключа. Если Вы используете Microsoft SQL Server, "Настраивающий Советник по вопросам Механизма базы данных" выручает много с этим.

3
ответ дан Eric Lathrop 24 November 2019 в 17:16
поделиться

То, что сказал lotoffreetime.

Прочтите главу 19 документации «Повышение производительности».
NHibernate: http://nhibernate.info/doc/nhibernate-reference/performance.html
Спящий режим: http://docs.jboss.org/hibernate/core/3.3/reference/en/ html / performance.html

Используйте SQL Profiler (или эквивалент для базы данных, которую вы используете), чтобы найти долго выполняющиеся запросы. Оптимизируйте эти запросы с помощью соответствующих индексов.

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

И, конечно же, кеш. Директива OutputCache для страниц / элементов управления. Кэширование данных NHibernate.

0
ответ дан 24 November 2019 в 17:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: