2016-12-09 2 views
0

У меня странная проблема. У меня есть приложение C#, которое делает несколько подключений к SQL (всего 7). Все отлично работало некоторое время, а затем внезапно, SQL разрывается на последнем соединении. Это довольно простое соединениеSQL-таймаут при последнем соединении

public static void APP() 
{ 
    using (SqlConnection conn7 = new SqlConnection(ConfigurationManager.ConnectionStrings["Connect"].ConnectionString)) 
    { 
     conn7.Open(); 
     SqlCommand cmd7 = new SqlCommand("sp_proc", conn7); 
     cmd7.CommandType = System.Data.CommandType.StoredProcedure; 
     cmd7.ExecuteNonQuery(); 

     conn7.Close(); 
    } 
} 

Эта строка подключения выглядит так.

add name="Connect" connectionString="Data Source=Server; Initial Catalog=DB; User ID=User; Password=password" providerName="System.Data.SqlClient" 

Я использую для каждого из них, и я закрываю каждое соединение в конце каждого класса. Кто-нибудь видел что-то подобное? У меня слишком много соединений?

Я запускаю каждый класс в порядке от Main.

+3

Как долго хранимая процедура займет выполнить? Таймаут по умолчанию - 30 секунд, но вы можете изменить его с помощью свойства 'cmd7.CommandTimeout'. (Вы также можете удалить его, установив его на '0'). – Siyual

+0

Позвольте мне увеличить тайм-аут и выпустить его – maltman

+1

Еще лучше - выполните процедуру непосредственно через SSMS или аналогичный инструмент и посмотрите, сколько времени потребуется для выполнения при нормальных обстоятельствах. Добавьте небольшой буфер для занятости и используйте его для вашего таймаута. – mason

ответ

3

Если таймаут, есть 3 вероятных сценария:

  • sp_proc просто занимает слишком много времени для запуска; вам нужно будет указать код
  • есть какая-то блокировка, которая делает невозможным ее завершение (возможно, открытая транзакция на конкурирующем SPID, который коснулся тех же данных и принял конфликтующие блокировки)
  • есть некоторые несвязанный нагрузку на сервер происходит в то же самое время, что делает его работать слишком медленно (это вряд ли будет проблемой, если это произойдет, надежно)
1

Я бы рекомендовал добавить

cmd7.CommandTimeout = 6000

тайм-аут измеряется в секундах, поэтому ставьте тайм-аут, приемлемый для пользователей приложения,

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

Одна вещь, которую вы, возможно, захотите сделать, - запустить трассировку \ sql-профиль в базе данных, с которой вы работаете, а также проверить наличие какой-либо блокировки.

Если это таймаут, я думаю, что есть процесс, который приостанавливается или замок какой-то где-то

+0

* «время ожидания измеряется в миллисекундах ...» * - [нет, это не так.] (Https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand. commandtimeout (v = vs.110) .aspx) Он измеряется в * секундах * - установка его на '6000' дает ему 1-часовое 40-минутное окно тайм-аута. – Siyual

+0

@Siyual вы правы, и я отредактировал свой ответ соответственно. Иногда я забываю, что измеряется в том, что –

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