Страница 1 из 1

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

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

Добавлено: 30 мар 2008, 11:44
kdv
что-то я не встречал, чтобы вызов этой функции завершался с ошибкой, если БД не битая...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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