Исключение Тайм-аута соединения для запроса с помощью ADO.NET

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

Веб-сайт Юникода предоставляет способ перевода категорий Юникода в набор кодовые точки. Поскольку это сайт Unicode , информация из него должна быть точной.

Обратите внимание, что вам нужно будет исключить символы верхнего уровня, так как JavaScript может обрабатывать символы меньше, чем FFFF (шестнадцатеричный). Я предлагаю проверить флажки «Аббревиатура» и «Побег», которые влияют на баланс между предотвращением непечатаемых символов и минимизацией размера регулярного выражения.

Вот некоторые общие расширения различных свойств Юникода:

\p{L} (Письма):

[A-Za-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]

\p{Nd} (Число десятичных цифр):

[0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]

\p{P} (Знак препинания):

[!-#%-*,-/\:;?@\[-\]_\{\}\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]

Страница также распознает ряд неясных классов символов, таких как \p{Hira}, которые являются буквами (японскими) хираганами:

[\u3041-\u3096\u309D-\u309F]

Наконец, можно подключить символ класс с более чем одним свойством Unicode, чтобы получить более короткое регулярное выражение, чем вы могли бы получить, просто объединив их (пока проверяются определенные настройки).

9
задан dragon 8 May 2009 в 14:27
поделиться

16 ответов

Так как Вы используете ExecuteNonQuery, который не возвращает строк, можно попробовать этот опрос базирующийся подход. Это выполняет запрос asyc способом (без обратного вызова), но приложение будет ожидать (внутри некоторое время цикл), пока запрос не будет завершен. Из MSDN. Это должно решить проблему тайм-аута. Испытайте его.

Но, я соглашаюсь с другими, что необходимо думать больше об оптимизации запроса выполнять менее чем 30 секунд.

        IAsyncResult result = command.BeginExecuteNonQuery();

        int count = 0;
        while (!result.IsCompleted)
        {
            Console.WriteLine("Waiting ({0})", count++);
            System.Threading.Thread.Sleep(1000);
        }
        Console.WriteLine("Command complete. Affected {0} rows.",
        command.EndExecuteNonQuery(result));
16
ответ дан 4 December 2019 в 08:35
поделиться

Я склонен не любить увеличивать тайм-аут соединения/команды с тех пор в моем уме, который был бы вопросом заботы о признаке, не проблемой

0
ответ дан 4 December 2019 в 08:35
поделиться

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

0
ответ дан 4 December 2019 в 08:35
поделиться

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

0
ответ дан 4 December 2019 в 08:35
поделиться

У нас недавно была подобная проблема о базе данных SQL Server 2000.

Во время Вашего запроса выполненного видит этот запрос на Вашей основной базе данных по серверу дб и существуют ли какие-либо блокировки, необходимо диагностировать:

select 
  spid,
  db_name(sp.dbid) as DBname,
  blocked as BlockedBy,
  waittime as WaitInMs,
  lastwaittype,
  waitresource,
  cpu,
  physical_io,
  memusage,
  loginame,
  login_time,
  last_batch,
  hostname,
  sql_handle
from sysprocesses sp
where (waittype > 0 and spid > 49) or spid in (select blocked from sysprocesses where blocked > 0)

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

В нашем случае это была блокировка networkio, которая заставила базу данных напряженно трудиться. Это был некоторый код VB прежней версии, который не разъединял его достаточно быстрый набор результатов.

1
ответ дан 4 December 2019 в 08:35
поделиться

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

  1. Проверьте со своим DBA и другой обзор кода, что Вы действительно оптимизировали запрос максимально лучше всего
  2. Работа над базовой структурой DB, чтобы видеть, существует ли какое-либо усиление, можно войти в сторону DB, создав/изменив idex (es).
  3. Разделите его на несколько частей, даже если это означает под управлением процедуры с несколькими возвращаемыми параметрами, которые просто называют другой параметрический усилитель. (Эта опция не изящна, и честно если бы Ваш код ДЕЙСТВИТЕЛЬНО собирается занять это много времени, я шел бы в управление и повторно обсудил бы 30 вторых тайм-аутов),
1
ответ дан 4 December 2019 в 08:35
поделиться

Я должен согласиться с Водяной черепахой.

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

Если это не опция, или если Вы хотите попробовать некоторые другие вещи сначала, вот Ваши три главных опции:

  1. Разбейте запрос в компоненты, которые работают под тайм-аутом. Это является, вероятно, самым легким.
  2. Измените запрос для оптимизации пути доступа через базу данных (обычно: удар индекса так тесно, как Вы можете),
  3. Измените или добавьте индексы для влияния на путь доступа запроса.
1
ответ дан 4 December 2019 в 08:35
поделиться
command.CommandTimeout *= 2;

Это удвоит тайм-аут по умолчанию, который составляет 30 секунд.

Или, поместите значение для CommandTimeout в конфигурационном файле, таким образом, можно скорректировать его по мере необходимости без перекомпиляции.

0
ответ дан 4 December 2019 в 08:35
поделиться

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

4
ответ дан 4 December 2019 в 08:35
поделиться

просто установите для свойства CommandTimeout sqlcommand значение 0, это приведет к тому, что команда будет ждать завершения запроса ... например:

SqlCommand cmd = new SqlCommand(spName,conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 0;
0
ответ дан 4 December 2019 в 08:35
поделиться

Вы пробовали обернуть свой sql внутри хранимой процедуры, похоже, они лучше управляют памятью. Подобные тайм-ауты уже встречались ранее в операторе sql плана с внутренними запросами с использованием классического ADO. т.е. выберите * из (выберите ....) t внутреннего соединения somthingTable. Когда внутренний запрос возвращал очень большое количество результатов.

Другие советы 1. Выполнение чтения с подсказкой выполнения with (nolock), это грязно, и я не рекомендую его, но он будет быстрее. 2. Также посмотрите на план выполнения sql, который вы пытаетесь запустить, и уменьшите сканирование строк, порядок, в котором вы присоединяетесь к таблицам. 3. посмотрите на добавление индексов в ваши таблицы для более быстрого чтения. 4. Я также обнаружил, что удаление строк очень дорогое, вы можете попытаться ограничить количество строк за один вызов. 5. Замена переменных @table на временные таблицы также работала для меня в прошлом. 6. Возможно, вы сохранили плохой план выполнения (слышал, никогда не видел).

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

0
ответ дан 4 December 2019 в 08:35
поделиться

Update: Looks like the query does not throw any timeout. The connection is timing out.

I.o.w., even if you don't execute a query, the connection times out? because there are two time-outs: connection and query. Everybody seems to focus on the query, but if you get connection timeouts, it's a network problem and has nothing to do with the query: the connection first has to be established before a query can be ran, obviously.

0
ответ дан 4 December 2019 в 08:35
поделиться

думали ли вы о том, чтобы разбить запрос на несколько более мелких частей?

Кроме того, выполняли ли вы свой запрос к помощнику по настройке ядра СУБД в:

Management Studio> Инструменты> Помощник по настройке ядра СУБД

Наконец, можем ли мы взглянуть на сам запрос?

Ура

0
ответ дан 4 December 2019 в 08:35
поделиться

Это УЖАСНЫЙ способ взлома, но он может временно решить вашу проблему. пока вы не решите настоящую проблему

    private static void CreateCommand(string queryString,string connectionString)
    {
        int maxRetries = 3;
        int retries = 0;
        while(true)
        {
            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlCommand command = new SqlCommand(queryString, connection);
                    command.Connection.Open();
                    command.ExecuteNonQuery();
                }
                break;
            }
            catch (SqlException se)
            {
                if (se.Message.IndexOf("Timeout", StringComparison.InvariantCultureIgnoreCase) == -1)
                    throw; //not a timeout

                if (retries >= maxRetries)
                    throw new Exception( String.Format("Timedout {0} Times", retries),se);

                //or break to throw no error

                retries++;
            }
        }
    }
1
ответ дан 4 December 2019 в 08:35
поделиться

If you are prohibited from using the features of the data access API to allow a query to last more than 30 seconds, then we need to see the SQL.

The performance gains to be made by optimizing the use of ADO.NET are slight in comparison to the gains of optimizing the SQL.

And you already are using the most efficient method of executing SQL. Other techniques would be mind numbingly slower (although, if you did a quick retrieval of your rows and some really slow client side processing using DataSets, you might be able to get the initial retrieval down to less than 30 seconds, but I doubt it.)

If we knew if you were doing inserts, then maybe you should be using bulk insert. But we don't know the content of your sql.

1
ответ дан 4 December 2019 в 08:35
поделиться

Возможно, стоит попробовать перелистать результаты назад.

0
ответ дан 4 December 2019 в 08:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: