Изменить по умолчанию SqlCommand CommandTimeout с конфигурацией, а не перекомпилировать? - PullRequest
6 голосов
/ 16 июня 2009

Я поддерживаю веб-приложение ASP.Net 3.5, и пользователи испытывают ошибку тайм-аута через 30 секунд при попытке запустить отчет. Оглядываясь в Интернете, кажется, что достаточно просто изменить время ожидания в коде, к сожалению, я не могу получить доступ к коду и перекомпилировать. Есть ли способ настроить значение по умолчанию для веб-приложения, рабочего процесса, IIS или всей машины?

Вот трассировка стека до точки, где он находится в System.Data, на случай, если я пропущу какую-то другую проблему:

[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
  System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1948826
  System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4844747
  System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
  System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392
  System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
  System.Data.SqlClient.SqlDataReader.get_MetaData() +83
  System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297
  System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954
  System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162
  System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
  System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
  System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
  System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
  System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +130
  System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) +162
  System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) +115

- Edit

Должно быть что-то вне самого кода - я скачал базу данных и запустил ее на том же веб-сайте, установленном на тестовом сервере, и он работает дольше 30 секунд и возвращает отчет. Я сравнил файлы machine.config и web.config из каталога .Net в режиме live и test, и они кажутся одинаковыми, сравнил две настройки IIS, также посмотрел конфигурацию SQL Server, и единственное отличие состоит в том, что live сервер кластеризован на 64-битном W2K3, а тестовый сервер на 32-битном.

Ответы [ 4 ]

14 голосов
/ 16 июня 2009

К сожалению, все, что я читал об этом в прошлом, говорит «нет», не может контролироваться через конфигурацию. Который облом.

3 голосов
/ 16 июня 2009

Вы не можете установить время ожидания команды из строки подключения или какой-либо внешней настройки, извините.

Иногда драйвер интерпретирует параметр «timeout» в строке подключения как период «Connect Timeout» и «Command Timeout», но технически это «ошибка». Должен любить стандарты.

2 голосов
/ 16 июня 2009

Лучшее, что я знаю, это то, что вы можете установить время ожидания подключения в строке подключения, которое контролирует, как долго ADO будет ждать при попытке подключения к SQL Server, и не влияет на время ожидания команды.

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

0 голосов
/ 03 июня 2010

Это не слишком сложно, чтобы свернуть свой собственный хотя? Просто создайте пользовательский параметр SqlCommandTimeout в AppSettings. Если вы уже используете какой-то SqlCommandFactory для создания своего SqlCommand или имеете какой-то базовый класс SqlCommand, то вы можете легко внести изменения. Если нет, то вам, вероятно, не нужно заботиться о своем коде, чтобы все равно захотеть поместить его в файл конфигурации.

С уважением, Джеймс

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