Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Сетевые таймауты - как бороться?


Автор: AndreyK 14.11.2011, 13:04
Проблема у меня возникла следующая.
Работает программа с MSSQL сервер.
Работает нормально.

Но в определенные дни (Суббота, Воскресенье) и определенные часы (с 14:00 до 23:00)
Вся работа расстраивается.

Периодически, с нарастающей вероятностью, запросы к SQL серверу заканчиваются ошибкой:
"80004005:[DBNETLIB][ConnectionOpen (Connect()).]SQL-сервер не существует, или отсутствует доступ."

И все бы ничего (повторное подключение проходит успешно), если бы не одно НО!

Данный запрос выполняется ровно 4 минуты (плюс минус 5 секунд)!
В особо жаркие часы такое подвисание происходит почти что через каждую минуту нормальной работы.

В это время программа глухо зависает и вся работа нарушается.

Подозрения: ложний MAC в сети или IP или что угодно, когда соединение не может найти SQL сервер.

КАК?!
Ну как мне задать такой таймаут, чтоб было хотя бы 15 секунд?
К какому месту обращаться (подозреваю, что это какие-то сетевые таймауты)

Сразу скажу, что .CommandTimeout и  .ConnectionTimeout у элемента ADODB.Connection установлены соответственно в 15 и 10 секунд.
А зависание происходит в методе .Execute

Автор: LSD 14.11.2011, 15:46
Цитата(AndreyK @  14.11.2011,  14:04 Найти цитируемый пост)
Но в определенные дни (Суббота, Воскресенье)

Дни наводят на мысль что проводится некие maintenance работы (сеть, сервера и т.п.).

Автор: AndreyK 14.11.2011, 17:12
Цитата(LSD @ 14.11.2011,  15:46)
Цитата(AndreyK @  14.11.2011,  14:04 Найти цитируемый пост)
Но в определенные дни (Суббота, Воскресенье)

Дни наводят на мысль что проводится некие maintenance работы (сеть, сервера и т.п.).

Да нет, местные админы сами не могут найти источник помех.
Это огромный развлекательный комплекс.
Кто-то приходит с глючным компом, как-то подключается к сети и у его компа IP совпадает с критическим адресом, из-за которого начинаются затыки с маршрутизацией.

(к стати никто не знает как надежно выявлять такое вредительство?)

Но мне надо просто, чтоб не было 4х минутного таймаута.
(Остальное - пусть админы вредителя ищут)

Автор: Akella 14.11.2011, 22:29
Может SQL сервер  или же роутер(ы) отключает клиента из-за неактивности? Попробуй раз в минуту, в несколько минут отправлять холостой запрос для поддержания активности соединения. Если где-то есть Kerio, то он точно обрывает неактивные соединения.

Автор: AndreyK 15.11.2011, 23:02
Да нет.
Программа работает с SQL сервером, со скоростью до сотни запросов в минуту.
Вернее не запросов, а коннектов, а SQL-запросов - тысячи, их приходится объединять в пакеты по сотне штук (до 64кв текста в одном пакете) , иначе потери скорости при каждом отдельном коннекте, могут сильно затормозить работу.

И вот, один из сотни запросов подвисает и ждет 4 минуты!
(Причем другие программы в это время спокойно общаются с сервером и даже с той же самой базой - т.е. сервер тут не при чем , это сеть)

Хотя, я уже нашел как решить проблему.
Примерно так:

Код

    starttime = GetTickCount() 
    retRc.Open ssql, dConnect, adOpenKeyset, adLockOptimistic, adAsyncExecute + adAsyncFetch
    Do While (retRc.state <> adStatusOK And retRc.state <> adStatusErrorsOccurred) And (GetTickCount() - starttime < 10000)
        Sleep 10
    Loop
    If retRc.state <> adStatusOK Then
        lasterror = Error
        LastErr = err
        GoTo connecterror
    End If



Асинхронные запросы и собственный таймаут.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)