2010-12-02 2 views
2

У нас есть приложение WCF, которое использует NHibernate для запроса данных из базы данных. После установки приложения в новую тестовую среду мы сталкиваемся с некоторыми проблемами производительности с запросами. В нашей старой и новой среде используются разные серверы Oracle, но обе базы данных имеют одинаковые данные.NHibernate + Oracle: проблемы с частотой при запросе данных

Мы прошли через наши журналы NHibernate и определили проблемную часть:

2010-12-02 07:14:22,673 NHibernate.SQL     - SELECT this_.CC... 
2010-12-02 07:14:22,688 NHibernate.Loader.Loader  - processing result set 
2010-12-02 07:14:27,235 NHibernate.Loader.Loader  - result set row: 0 

В этом случае запрос возвратил одну строки. Но кажется, что в нашей новой среде «результат обработки результатов» занимает гораздо больше времени (5 секунд против 0,5 секунды), чем в нашей другой среде. Есть ли способ выяснить, что внутри «набора результатов обработки» занимает так много времени?

Примечание. Выполнение одного и того же точного запроса непосредственно в БД с помощью Toad не воспроизводит проблему. С помощью Toad оба сервера базы данных одинаково быстры.

Мы используем DetachedCriteria для создания запроса, а затем она выполняется так:

 Dim criteria As ICriteria = crit.GetExecutableCriteria(GetSession()) 
     Return New Generic.List(Of T)(criteria.List(Of T)) 

Версия NHibernate является 2.1.2.4, и мы используем ActiveRecord 2.1.0 для создания отображения. Серверы Oracle имеют версию 10g.

Итак, в нашем случае у нас есть две среды, которые имеют одну и ту же версию приложения с идентичными конфигурационными файлами и запрашивают идентичные базы данных, но имеют разные серверы приложений и оракулов. В одной среде запрос через NHibernate занимает около 5,5 секунд, а в течение еще 0,5 секунд. Результаты согласованы, и один и тот же запрос был выполнен примерно в 50 раз для обеих сред.

Есть ли что-то в конфигурации Oracle, которая может привести к неправильной работе с NHiberate? И есть ли способ получить более подробный выход из NHibernate, чтобы можно было найти точную проблему внутри «набора результатов обработки»?

Любые советы приветствуются.

+0

Трудно сказать .. Не может ли быть узкое место в сети между новой тестовой средой и сервером db? Вы пытались запустить Toad с сервера WCF? – 2010-12-02 06:31:04

+0

Чтобы устранить базу данных, вы можете проследить сеанс и сравнить результаты по старым и новым. Может быть, разработчик sql явно задает параметры сеанса, которые по умолчанию различаются для новой и старой базы данных. – 2010-12-02 08:28:39

ответ

1

Мы смогли исправить нашу проблему, переключив драйверы баз данных с Microsoft на Oracl e's ODP.net. Теперь оба сервера одинаково быстры, и даже наш ранее быстрый сервер выполняет запросы намного быстрее. Мы не знаем, какие настройки на нашем новом сервере заставили Oracle Oracle настолько медленным.

И кажется, что Microsoft в настоящее время рекомендует всем использовать что-то другое, чем их собственные Oracle-драйверы. http://blogs.msdn.com/b/adonet/archive/2009/06/15/system-data-oracleclient-update.aspx

1

Выполните SQL след на обеих средах, добавив это заявление в сессию:

альтер сеансовые timed_statistics = истина; изменить набор сеансов max_dump_file_size = неограничен; изменить набор событий сеанса 10046 контекст имени навсегда, уровень 8 ';

- ваш запрос отправлен здесь выберите * from mytable где x = 1;

изменить сеанс набора событий «10046 имя трассировки контекста выключено»;

затем используйте tkprof для проверки файла трассировки (goto user_dump_dest обычно представляет собой каталог с именем udump в имени и tkprof outputfile.log inputtracefilename.TRC)

типа TKPROF

сам по себе, чтобы увидеть помощи экрана и параметры командной

Также

Убедитесь, что вы используете одни и те же параметры в INIT.ORA для таких вещей, как CURSOR_SHARING =

в обеих базах данных