Запрос получил ошибку тайм-аута в NHibernate, но не в SQL Server - PullRequest
8 голосов
/ 25 декабря 2010

У меня проблема с NHibernate в C #.

Когда он хочет выполнить запрос, приложение сталкивается с ошибкой тайм-аута ADO, но когда я использую SQL Profiler для захвата запроса, а затем запускаю егов новом запросе SQL Server это занимает всего 2 секунды

Есть идеи ??

Ответы [ 2 ]

9 голосов
/ 27 декабря 2010

Когда вы захватываете запрос из SQL Profiler и запускаете его в SSMS, вы запускаете его как запрос sp_executesql? Я столкнулся с подобной проблемой при использовании NHibernate 2.1GA, и этот ответ относится к той версии, я еще не перешел на NH3. NH Profiler - отличный инструмент, но он услужливо извлекает SQL в форматированный запрос, который не соответствует фактическому запросу, отправленному на сервер.

Проблема в том, как NHibernate предоставляет строковые параметры в sp_executesql. Строковые параметры печатаются как nvarchar с длиной, равной длине значения. Например, этот запрос ограничивает два столбца: varchar (4) и varchar (20) соответственно:

exec sp_executesql N'SELECT this_.Column0, this_.Column1 FROM MySchema.MyTable this_ WHERE this_.Column0 = @p0 and this_.Column1 = @p1',N'@p0 nvarchar(4),@p1 nvarchar(7)',@p0='Val0',@p1='Value01'

План запроса для этого использовал сканирование индекса и занял 17 секунд. Изменение nvarchar на varchar привело к созданию плана, который использовал поиск по индексу и выполнялся в течение <2 секунд. Это было воспроизводимо в SSMS. </p>

Основной причиной было то, что NHibnerate по умолчанию использует DbType.String вместо DbType.AnsiString для столбцов varchar. Решением для меня было добавить соглашение Fluent NHibernate для изменения всех отображений строк на AnsiString, что заставило NHibernate создавать запросы, предоставляющие параметры в виде varchar.

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

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

, а также использование профилей nhibernate - это то, что я бы тоже посоветовал.фактически показывает запрос, запущенный к БД, и извлеченные строки и очень прост в использовании. Все, что вам нужно сделать, это установить строку подключения на дБ, к которому вы выполняете запрос, и вуаля вы можете видеть все ваши запросы, и вымогу попрощаться с профилировщиком SQL.

Надеюсь, это поможет.

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