2014-12-29 2 views
0

Я пытаюсь выполнить хранимую процедуру (запрос) из ASP Web API. Я разработал его (таймаут команды составляет 300 секунд).SqlConnection Ошибка таймаута через API-интерфейс ASP.NET

В начале вызов хранимой процедуры из Web API выполняется очень быстро, но через несколько дней при вызове одного и того же WEB-интерфейса он дает мне ошибку тайм-аута (см. Ниже).

Между тем, если я попытаюсь выполнить одну и ту же хранимую процедуру с тем же параметром, даже в то же время, непосредственно из SQL Server Management Studio, она выполняется в течение нескольких секунд.

Код:

public List<ScheduledTitles> GetScheduledTitles(CriteriaFields _criteria) 
{ 
     try 
     { 
      System.Data.DataSet ds = new DataSet(); 
      SqlDataAdapter da = new SqlDataAdapter(); 

      using (SqlConnection con = new SqlConnection(_strDBConnection)) 
      { 
       con.Open(); 
       SqlCommand comm = new SqlCommand(); 
       comm.Connection = con; 
       comm.CommandText = "spQuery_1"; 
       comm.Parameters.Add(new SqlParameter() { ParameterName = "Product_Line_ID", SqlDbType = SqlDbType.Int, Value = _criteria.ProductLineID == null ? (object)System.DBNull.Value : _criteria.ProductLineID }); 

       comm.CommandType = CommandType.StoredProcedure; 
       da.SelectCommand = comm; 
       comm.CommandTimeout = 300; 
       da.Fill(ds); 
      } 
      . 
      . 
      . 

      return scheduledTitlesS.ToList<ScheduledTitles>(); 
     } 
     catch (Exception exc) 
     { 
      throw exc; 
     } 
    } 

Сообщение об ошибке:

Время ожидания истекло до завершения операции или сервер не отвечает.
в System.Data.SqlClient.SqlConnection.OnError (SqlException исключением, булевой breakConnection, Действие 1 1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource
завершение, Int32 тайм-аут, Задача & задачи, булева asyncWrite)
в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, булева returnStream, метод String)
на System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String)
на System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String)
на System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (поведение CommandBehavior)
в System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader (поведение CommandBehavior)
в System.Data.Common.DbDataAdapter.FillInternal (DataSet dataset, DataTable [] datatables, Int32 startRecord, Int32 maxRecords, String srcTable , IDbCommand команды, поведение CommandBehavior)
в System.Data.Common.DbDataAdapter.Fill (DataSet DataSet, Int32, Int32 startRecord MaxRecords, струнного srcTable, команды IDbCommand, поведение CommandBehavior)
в System.Data.Common.DbDataAdapter.Fill (DataSet DataSet)
в HERS_SearchQuery.Data.DataAccess.SQLServer.HERSScheduleRepository.GetScheduledTitles (CriteriaFields _criteria) в C: \ Users \ Нах \ Documents \ Visual Studio 2010 \ Projects \ HERS_SchedulerSearch \ HERS_SearchQuery.Data \ DataAccess \ SQLServer

+0

Вы пытались закрыть соединение после заполнения адаптера данных? – Tim

+0

Как сказал Тим, кажется, что ваши соединения не закрываются; что количество подключений может связывать ваши вызовы SQL. Используйте con.Close() с окончательно в своих инструкциях Try Catch – sunnysidedown916

+0

Пожалуйста, покажите, как выглядит _strDBConnection.Убедитесь, что «context connection = false» – MikeG

ответ

0

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

С RECOMPILE

в strored порядке. Случилось так, что SQL SERVER кэшировал план выполнения, который не был эффективным для всех параметров.

Конечно, я не знаю, может ли это решить вашу проблему, но я думаю, что стоит попробовать.

Смежные вопросы