| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > СУБД, общие вопросы > Сетевые таймауты - как бороться? |
| Автор: 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 |
Дни наводят на мысль что проводится некие maintenance работы (сеть, сервера и т.п.). |
| Автор: AndreyK 14.11.2011, 17:12 | ||
Да нет, местные админы сами не могут найти источник помех. Это огромный развлекательный комплекс. Кто-то приходит с глючным компом, как-то подключается к сети и у его компа IP совпадает с критическим адресом, из-за которого начинаются затыки с маршрутизацией. (к стати никто не знает как надежно выявлять такое вредительство?) Но мне надо просто, чтоб не было 4х минутного таймаута. (Остальное - пусть админы вредителя ищут) |
| Автор: Akella 14.11.2011, 22:29 |
| Может SQL сервер или же роутер(ы) отключает клиента из-за неактивности? Попробуй раз в минуту, в несколько минут отправлять холостой запрос для поддержания активности соединения. Если где-то есть Kerio, то он точно обрывает неактивные соединения. |
| Автор: AndreyK 15.11.2011, 23:02 | ||
| Да нет. Программа работает с SQL сервером, со скоростью до сотни запросов в минуту. Вернее не запросов, а коннектов, а SQL-запросов - тысячи, их приходится объединять в пакеты по сотне штук (до 64кв текста в одном пакете) , иначе потери скорости при каждом отдельном коннекте, могут сильно затормозить работу. И вот, один из сотни запросов подвисает и ждет 4 минуты! (Причем другие программы в это время спокойно общаются с сервером и даже с той же самой базой - т.е. сервер тут не при чем , это сеть) Хотя, я уже нашел как решить проблему. Примерно так:
Асинхронные запросы и собственный таймаут. Так, что ,кто еще будет разрабатывать сетевые приложения, знайте - сетевые службы могут подвесить любое ваше соединение на неопределенное время, хоть какой таймаут не задавай. |