powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Восстановление связи с сервером
20 сообщений из 20, страница 1 из 1
Восстановление связи с сервером
    #39704001
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем!
У меня клиент связывается с сервером с помощью библиотеки IBPP.
Можно ли, с помощью этой библиотеки, как-то отловить аварийную потерю связи с сервером?
Я уже поискал на форуме - советуют дёргать сервер простым запросом, например select current_time from rdb$database.
Я так и сделал. Вызываю такую функцию в цикле, в отдельном потоке:
int TestConnect(char *destptr)
{
int ret = -1;

pthread_mutex_lock(&mutex);

try
{
if (qtestconnect->exec(st))
ret = 1;
else
{
ret = -1;
errorstr = (string) qtestconnect->errorstr.c_str();
log("Error TDataLayer::TestConnect: - " + errorstr);
}
}
catch (IBPP::Exception& e)
{
errorstr = cp2koi(e.what(),1);
ret = -1;
log("Error TDataLayer::TestConnect: - " + errorstr);
}
Дрбрый день всем!
У меня клиент связывается с сервером с помощью библиотеки IBPP.
Можно ли, с помощью этой библиотеки, как-то отловить аварийную потерю связи с сервером?
Я уже поискал на форуме - советуют дёргать сервер простым запросом, например select current_time from rdb$database.
Я так и сделал. Вызываю такую функцию в цикле, в отдельном потоке:
int TestConnect(char *destptr)
{
int ret = -1;

pthread_mutex_lock(&mutex);

try
{
if (qtestconnect->exec(st))
ret = 1;
else
{
ret = -1;
errorstr = (string) qtestconnect->errorstr.c_str();
log("Error TDataLayer::TestConnect: - " + errorstr);
}
}
catch (IBPP::Exception& e)
{
errorstr = cp2koi(e.what(),1);
ret = -1;
log("Error TDataLayer::TestConnect: - " + errorstr);
}

pthread_mutex_unlock(&mutex);

return (ret);
},
где:
qtestconnect = new TIBPPQuery(db, "cp1251", "utf8");
qtestconnect->SetNewQuery("select current_time from rdb$database", IBPP::amRead);
.
Но когда выдёргиваю кабель, программа просто виснет на выполнении запроса (qtestconnect->exec(st)) и не попадает ни в блок else, ни в блок catch.
Можно ли, средствами IBPP, как-то отловить аварийную потерю связи с сервером или в этом случае придётся пинговать сервер?
pthread_mutex_unlock(&mutex);

return (ret);
},
где:
qtestconnect = new TIBPPQuery(db, "cp1251", "utf8");
qtestconnect->SetNewQuery("select current_time from rdb$database", IBPP::amRead);
.
Но когда выдёргиваю кабель, программа просто виснет на выполнении запроса (qtestconnect->exec(st)) и не попадает ни в блок else, ни в блок catch.
Можно ли, средствами IBPP, как-то отловить аварийную потерю связи?
Или может ещё какой-нибудь способ есть?
Заранее спасибо.
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704003
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...чё-то у меня тут лишнее скопировалось...
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704012
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джек,

код надо было оформлять в тегах
Код: plaintext
[SRC C++][/SRC]
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704021
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
...
...
...
qtestconnect = new TIBPPQuery(db, "cp1251", "utf8");
qtestconnect->SetNewQuery("select current_time from rdb$database", IBPP::amRead);
...
...
...
int TestConnect(char *destptr)
{
int ret = -1;

pthread_mutex_lock(&mutex);

try
{
if (qtestconnect->exec(st))
ret = 1;
else
{
ret = -1;
errorstr = (string) qtestconnect->errorstr.c_str();
log("Error TDataLayer::TestConnect: - " + errorstr);
}
}
catch (IBPP::Exception& e)
{
errorstr = cp2koi(e.what(),1);
ret = -1;
log("Error TDataLayer::TestConnect: - " + errorstr);
}

pthread_mutex_unlock(&mutex);

return (ret);
}
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704036
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДжекНо когда выдёргиваю кабель, программа просто виснет на выполнении запроса (qtestconnect->exec(st)) и не попадает ни в блок else, ни в блок catch.

Ну пока она висит уж точно не попадёт ни в какой блок. Для начала добейся чтобы программа быстрее реагировала на то что ты выдернул кабель. См. параметр
ConnectionTimeout = 180 (умолчание)
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704044
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисConnectionTimeout = 180
У какого класса это параметр? Я не нашёл, ни у TIBPPQuery, ни у IBPP::DatabaseFactory.
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704046
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...даже если так:
ConnectionTimeout = 180 (умолчание),
то это тоже не работает - программа не три минуты висит, а навсегда.
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704049
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...мне со стороны клиента нужно отловить, а не со стороны сервера.
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704052
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джек,

это параметр уровня коннекта Firebird. Как его там установить в IBPP ХЗ. Ну наверное через isc_dpb можно.

Если висит навсегда, то надо отлаживать ваш код, возможно где-то зацикливание
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704070
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дёргать сервер в отдельном потоке - плохая идея.
Ибо он может ответить там, но через секунду связь оборвётся и основной поток получит сообщение об ошибке.
Которое в любом случае нужно корректно обработать.
Так что отдельный поток никак не избавляет от этой необходимости.

PS Насчёт "зависания навсегда" - читай про keepalive.
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704071
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот весь код:
static void* reconnect_thread(gpointer data)
{
while(1)
{
if(!dl->TestConnect(NULL))
log("Нет соединения с базой данных.");
else
log("Есть соединение с базой данных.");
g_usleep(1000000);
}
}
.
Когда запускаю, через секунду выводятся сообщения "Есть соединение с базой данных.".
Когда выдёргиваю кабель - ни одного сообщения "Нет соединения с базой данных." не появляется.
Вот это:
ConnectionTimeout = 180 (умолчание),
наверно таймаут соединения, а не выполнения запроса.
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704089
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и есть.
ConnectionTimeout = 180 - на стороне сервера, в файле firebird.conf.
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704096
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джек,

автор# ----------------------------
# Client Connection Settings (Basic)
#
# Seconds to wait before concluding an attempt to connect has failed.
#
# Per-connection configurable.
#
# Type: integer
#
#ConnectionTimeout = 180

ну скорее всего да, это тайм-аут установки самого коннекта, но вот только это Per-connection
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704105
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, будут сначала пинговать, а потом запросом проверять.
Есть вероятность, что при успешном пинге выдаст всё-таки ошибку при неудачном запросе.
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704119
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джек,

какая у тебя конечная цель ? Зачем всё это ?
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704152
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladкакая у тебя конечная цель ? Зачем всё это ?
Автоматическое восстановление связи - у сервера электричество пропадает.
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704159
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джек,

у сервера? Так тут уже ничего не поможет. Или может просто на свитчах/роутерах пропадает питание?
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704161
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис Или может просто на свитчах/роутерах пропадает питание?
Может быть. Я не сисадмин. Мне сисадмин сказал что-то про отключение. И что надо сделать восстановление...
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704171
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джекhvladкакая у тебя конечная цель ? Зачем всё это ?
Автоматическое восстановление связи - у сервера электричество пропадает.И каким боком тут фоновый поток и прочие извраты ?
Если связь пропадёт, когда основной поток выполняет запрос - чем тут поможет фоновый ?
Зачем это всё ?
...
Рейтинг: 0 / 0
Восстановление связи с сервером
    #39704193
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джекпрограмма не три минуты висит, а навсегда.

Подключайся к ней отладчиком и смотри где конкретно она "висит".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Восстановление связи с сервером
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]