Час очікування з'єднання для SQL-сервера


109

Чи можна збільшити час очікування, змінивши рядок з'єднання в web.config?


7
Не читайте це так, як я думав, що тайм-аут контролюватиме виконання запитів - це не так, тільки кращим іменем може бути лише час очікування на підключення до сервера. Див stackoverflow.com/a/7976867/409856
downwitch

Відповіді:


213

Так, ви могли б додати ;Connection Timeout=30до вашої рядку з'єднання і вказати значення , яке ви хочете.

Значення тайм-ауту, встановлене у Connection Timeoutвластивості, - це час, виражений у секундах . Якщо ця властивість не встановлена, значенням затримки для з'єднання є значення за замовчуванням (15 секунд).

Крім того, встановлюючи значення тайм-ауту 0, ви вказуєте, що ваша спроба з'єднання чекає нескінченний час. Як описано в документації, це не слід встановлювати у рядку з'єднання:

Значення 0 вказує на обмеження, і його слід уникати в ConnectionString, оскільки спроба з'єднання чекає нескінченно.


4
Це час очікування в хвилинах чи секундах?
user1

1
@ user1 "Тривалість часу (у секундах) для очікування з'єднання з сервером до припинення спроби та генерування помилки."
Santux

5
FYI: Час очікування підключення = 0 нескінченний.
Абдул Сабур

Чи можете ви навести приклад для цього? Я використовую EF6 a У мене в таблиці 3 мільйони даних, коли я виконую програму, повертає помилку тайм-ауту ... Примітка: я використовую індексацію в таблиці
saulyasar

4
@saulyasar Це час вимкнення СПОЛУЧЕННЯ, а не тайм-аут КОМАНДИ. Час очікування підключення - це час, який буде намагатися ПІДКЛЮЧИТИ до сервера sql. Ви хочете дослідити тайм-аут КОМАНДИ, який полягає в тому, як триватиме процедура або заява до закінчення часу.
granadaCoder

32

Гммм ...

Як сказав Дарін, ви можете вказати більше значення тайм-ауту для з'єднання, але я сумніваюся, що це справді проблема.

Коли ви отримуєте тайм-аути підключення, зазвичай це проблема одного з наступних:

  1. Конфігурація мережі - повільний зв'язок між вашим веб-сервером / полем розробки та SQL-сервером. Збільшення тайм-аута може виправити це, але було б розумно дослідити основну проблему.

  2. Рядок з'єднання. Я бачив проблеми, коли неправильне ім’я користувача / пароль чомусь призведе до помилки очікування замість реальної помилки із зазначенням "заборонено в доступі". Це не повинно відбуватися, але таке життя.

  3. Рядок підключення 2: Якщо ви вказуєте ім'я сервера неправильно або неповно (наприклад, mysqlserverзамість цього mysqlserver.webdomain.com), ви отримаєте тайм-аут. Чи можете ви пінг-сервер, використовуючи ім’я сервера точно так, як зазначено в рядку з'єднання з командного рядка?

  4. Рядок підключення 3: Якщо ім'я сервера знаходиться у вашому DNS (або файлі хостів), але вказує на неправильний або недоступний IP-адресу, ви отримаєте тайм-аут, а не помилку, яку не знайшли машини.

  5. Час запиту закінчується. Це може виглядати як проблема з підключенням до сервера, але, залежно від структури вашого додатка, ви можете зробити це до стадії, де виконується ваш запит до того, як настане час очікування.

  6. Підключення протікає. Скільки запущених процесів? Скільки відкритих з'єднань? Я не впевнений, чи необроблений ADO.NET здійснює об'єднання з'єднань, автоматично закриває з'єднання при необхідності ala Enterprise Library або там, де все налаштовано. Це, мабуть, червона оселедець. Однак, працюючи з WCF та веб-службами, у мене виникли проблеми із незамкнутими зв’язками, що спричиняло тайм-аути та іншу непередбачувану поведінку.

Що потрібно спробувати:

  1. Чи отримуєте ви тайм-аут під час підключення до сервера за допомогою SQL Management Studio? Якщо так, то, можливо, проблема з мережевим налаштуванням. Якщо ви не бачите проблем під час з'єднання з Management Studio, проблема буде у вашому додатку, а не з сервером.

  2. Запустіть SQL Profiler і подивіться, що насправді відбувається через провід. Ви повинні бути в змозі сказати, чи дійсно ви підключаєтесь, чи проблема з проблемою.

  3. Запустіть свій запит у студії управління і подивіться, скільки часу це займе.

Удачі!


якщо ваш запит закінчується, я думаю, ви отримаєте команду timeout
user55474

@ user55474 напевно; залежить ( дуже рідко) від того, як його називають.
3Dave

Не відповідно до цього повідомлення в блозі msdn
tom redfern

@hugh Я вважаю, я сказав, що це було рідко, але я це бачив з перших рук.
3Dave

1
+1 для "Запустити SQL Profiler". Здається, що це буде складно, але ви насправді просто натискаєте "Інструменти> Профілер SQL Server" і дивитеся, що ваша програма говорить про SQL Server. Виявляється, моя була Варіант №5 :)
Андрій Квочик

11

Якщо ви хочете динамічно змінити це, я вважаю за краще використовувати SqlConnectionStringBuilder .

Це дозволяє перетворити ConnectionString, тобто рядок, в клас Object, Усі властивості рядка з'єднання стануть його Учасником.

У цьому випадку реальною перевагою буде те, що вам не доведеться турбуватися, якщо частина рядка ConnectionTimeout вже існує в рядку з'єднання чи ні?

Крім того, оскільки він створює Об'єкт і завжди добре присвоювати значення об'єкту, а не маніпулювати рядком.

Ось зразок коду:

var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);

2
Я не можу повірити, що зробити ConnectionTimeoutвластивість SqlConnectionтипу типу лише для читання вважалося гарною ідеєю.
Маслоу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.