Проверка подключения к серверу

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
ArtDen
Сообщения: 53
Зарегистрирован: 25 ноя 2007, 10:54

Проверка подключения к серверу

Сообщение ArtDen » 30 мар 2008, 11:16

В проекте для работы с FB задействована библиотека IBPP. Для проверки, есть ли подключение к серверу, я использую запрос статистики сервера (функция IBPP::Statistics, которая внутри вызывает database_info). Если вызов функции завершился с ошибкой, я переподключаюсь.
Насколько это корректный подход? Может есть более правильное решение?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 30 мар 2008, 11:44

что-то я не встречал, чтобы вызов этой функции завершался с ошибкой, если БД не битая...

ArtDen
Сообщения: 53
Зарегистрирован: 25 ноя 2007, 10:54

Сообщение ArtDen » 30 мар 2008, 11:51

kdv писал(а):что-то я не встречал, чтобы вызов этой функции завершался с ошибкой, если БД не битая...
Да элементарно: юзер выключил а затем включил сервак, или на клиенте в винде вынули сетевой кабель, а затем подключили. Все эти причины ведут к обрыву TCP подключения и мне надо это отлавливать и переподключаться.
Тот подход, что я описал в первом сообщении - работает на клиенте безо всяких проблем. Вот только как это сказывается на сервере?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 30 мар 2008, 12:05

ArtDen писал(а):
kdv писал(а):что-то я не встречал, чтобы вызов этой функции завершался с ошибкой, если БД не битая...
Да элементарно: юзер выключил а затем включил сервак, или на клиенте в винде вынули сетевой кабель, а затем подключили. Все эти причины ведут к обрыву TCP подключения и мне надо это отлавливать и переподключаться.
Сетевые ошибки имеют свои собственные коды
ArtDen писал(а):Тот подход, что я описал в первом сообщении - работает на клиенте безо всяких проблем. Вот только как это сказывается на сервере?
Что "это" ?

ArtDen
Сообщения: 53
Зарегистрирован: 25 ноя 2007, 10:54

Сообщение ArtDen » 30 мар 2008, 12:20

hvlad писал(а):Сетевые ошибки имеют свои собственные коды
Я и не отрицаю. Просто хочется иметь простой способ узнать, что соединение отвалилось и своевременно переподключиться перед работой с данными. В принципе, IBPP позволяет это сделать через отлов события отключения, но этот вариант меня не устраивает
hvlad писал(а):Что "это" ?
"Это" - это вызов database_info для тестирования подключения.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 30 мар 2008, 12:33

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

ArtDen
Сообщения: 53
Зарегистрирован: 25 ноя 2007, 10:54

Сообщение ArtDen » 30 мар 2008, 12:42

kdv писал(а):какие-то противоречивые желания или вопросы. "я знаю как это происходит, но ..."
Вопрос был такой: насколько это правильное решение - запрашивать статистику сервера для того, чтобы узнать не отвалилось ли TCP соединение и при необходимости переподключиться. Если моё решение неправильное, то буду рад выслушать любое другое или вообще узнать любые другие мнения по этому вопросу.
kdv писал(а):нет "события отключения". Есть ошибка при попытке работать с сервером, из-за того что соединение отвалилось.
Не занимался этим вопросом, но вашему авторитету доверяю полностью :)

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 30 мар 2008, 13:06

ArtDen писал(а):
hvlad писал(а):Сетевые ошибки имеют свои собственные коды
Я и не отрицаю. Просто хочется иметь простой способ узнать, что соединение отвалилось и своевременно переподключиться перед работой с данными.
На них и нужно ориентироваться.
ArtDen писал(а):
hvlad писал(а):Что "это" ?
"Это" - это вызов database_info для тестирования подключения.
Т.е. ты перед каждым вызовом ("работой с данными") таким образом тестируешь подключение ? А смысл ?

Серверу фиолетово, что ты постоянно дёргаешь database_info, юзеру будет не фиолетово.

ArtDen
Сообщения: 53
Зарегистрирован: 25 ноя 2007, 10:54

Сообщение ArtDen » 30 мар 2008, 13:16

hvlad писал(а):Т.е. ты перед каждым вызовом ("работой с данными") таким образом тестируешь подключение ? А смысл ?
Смысл в том, чтобы узнать об отвалившемся соединении перед работой с данными, а не в процессе. В моём случае последовательность такая:

Код: Выделить всё

1. Проверка подключения к базе (и переподключение, если подключение отвалилось)
2. Работа с данными
Если отлавливать сетевые ошибки, то последовательность будет такая:

Код: Выделить всё

1. Попытка работы с данными
2. Если попытка завершилась с ошибкой (работы с сетью), то 
{
     3. Переподключается
     4. Повторяем работу с данными
}
Как видишь, мой вариант проще.
hvlad писал(а):Серверу фиолетово, что ты постоянно дёргаешь database_info, юзеру будет не фиолетово.
А как это будет отображаться на юзере? Или в некоторых случаях запрос статистики может занять длительное время?

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 30 мар 2008, 14:13

database_info это же много буковок будет возрощать, не проще тогда ли
делать "select 1 from rdb$database" дабы сервер думать не напрягать

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 30 мар 2008, 15:21

Если отлавливать сетевые ошибки, то последовательность будет такая:
я не знаю, как там в IBPP, но идея при ошибке переоткрывать коннект и повторять действие с данными ужасна.
Потому что повторять придется тучу операций, в зависимости от контекста.
Потеря коннекта означает что все, амбец, контекст соединения с сервером утерян, и надо начинать все сначала. Т.е. для клиент-серверных приложений с множеством форм и определенной последовательностью работы это означает необходимость _перезапуска_ приложения.

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

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 30 мар 2008, 15:35

ArtDen писал(а):
hvlad писал(а):Т.е. ты перед каждым вызовом ("работой с данными") таким образом тестируешь подключение ? А смысл ?
Смысл в том, чтобы узнать об отвалившемся соединении перед работой с данными, а не в процессе. В моём случае последовательность такая:

Код: Выделить всё

1. Проверка подключения к базе (и переподключение, если подключение отвалилось)
2. Работа с данными
Если отлавливать сетевые ошибки, то последовательность будет такая:

Код: Выделить всё

1. Попытка работы с данными
2. Если попытка завершилась с ошибкой (работы с сетью), то 
{
     3. Переподключается
     4. Повторяем работу с данными
}
Как видишь, мой вариант проще.
Он просто глупый и ничего не гарантирует.
Что ты будешь делать, если коннект порвётся во время твоих действий с данными ?
ArtDen писал(а):
hvlad писал(а):Серверу фиолетово, что ты постоянно дёргаешь database_info, юзеру будет не фиолетово.
А как это будет отображаться на юзере? Или в некоторых случаях запрос статистики может занять длительное время?
Запрос-ответ через сеть не за нулевое время ходит

ArtDen
Сообщения: 53
Зарегистрирован: 25 ноя 2007, 10:54

Сообщение ArtDen » 30 мар 2008, 21:13

hvlad писал(а):Он просто глупый и ничего не гарантирует.
Что ты будешь делать, если коннект порвётся во время твоих действий с данными ?
Обрыв коннекта во время операций с данными - это уже второй вопрос. Меня в сейчас первую очередь интересует проверка на наличие соединения.
hvlad писал(а):Запрос-ответ через сеть не за нулевое время ходит
Но всё равно быстро, так что это для меня не критично.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 30 мар 2008, 22:34

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

ArtDen
Сообщения: 53
Зарегистрирован: 25 ноя 2007, 10:54

Сообщение ArtDen » 02 апр 2008, 07:13

hvlad писал(а):Ты спросил - тебе ответили.
Ну да, сказали по кодам сетевых ошибок отлавливать. Только вот не сказали, какие именно коды использовать. Там их целая куча этих сетевых ошибок.
hvlad писал(а):Прячь проблемы от себя и дальше, только не нужно других ими потом грузить.
Не понял мысли. Поясните. Зачем я обязательно должен потом кого-то грузить проблемами? :)

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 02 апр 2008, 11:57

ArtDen писал(а):Только вот не сказали, какие именно коды использовать. Там их целая куча этих сетевых ошибок.
Перечисли кучу, я поправлю
ArtDen писал(а):
hvlad писал(а):Прячь проблемы от себя и дальше, только не нужно других ими потом грузить.
Не понял мысли. Поясните. Зачем я обязательно должен потом кого-то грузить проблемами? :)
Ещё раз говорю - твой метод ничего не даёт кроме лишних запросов к серверу.
С проблемами ты уже пришёл. Пока что они ещё не такие большие...

ArtDen
Сообщения: 53
Зарегистрирован: 25 ноя 2007, 10:54

Сообщение ArtDen » 02 апр 2008, 20:01

hvlad писал(а):Перечисли кучу, я поправлю
Наиболее подходящими мне кажутся следующие:
isc_network_error
isc_net_read_err
isc_net_write_err
hvlad писал(а):С проблемами ты уже пришёл. Пока что они ещё не такие большие...
Я пришёл с вопросом. Проблем пока у меня нет. И ошибки я отлавливаю, даже в том случае, если соединение отвалилось в процессе работы с данными, так что не надо меня упрекать, что создаю себе проблемы :)

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 02 апр 2008, 20:22

ArtDen писал(а):
hvlad писал(а):Перечисли кучу, я поправлю
Наиболее подходящими мне кажутся следующие:
isc_network_error
isc_net_read_err
isc_net_write_err
А говорил - куча :)
Годится
ArtDen писал(а):
hvlad писал(а):С проблемами ты уже пришёл. Пока что они ещё не такие большие...
Я пришёл с вопросом. Проблем пока у меня нет. И ошибки я отлавливаю, даже в том случае, если соединение отвалилось в процессе работы с данными, так что не надо меня упрекать, что создаю себе проблемы :)
Тебе на вопрос ответили. Ответ тебя не устраивает. Так какого эту жвачку жевать ?

Ответить