Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Восстановление связи с сервером / 20 сообщений из 20, страница 1 из 1
18.09.2018, 09:41
    #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
18.09.2018, 09:44
    #39704003
Джек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление связи с сервером
...чё-то у меня тут лишнее скопировалось...
...
Рейтинг: 0 / 0
18.09.2018, 09:51
    #39704012
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление связи с сервером
Джек,

код надо было оформлять в тегах
Код: plaintext
[SRC C++][/SRC]
...
Рейтинг: 0 / 0
18.09.2018, 10:01
    #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
18.09.2018, 10:14
    #39704036
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление связи с сервером
ДжекНо когда выдёргиваю кабель, программа просто виснет на выполнении запроса (qtestconnect->exec(st)) и не попадает ни в блок else, ни в блок catch.

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

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

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

PS Насчёт "зависания навсегда" - читай про keepalive.
...
Рейтинг: 0 / 0
18.09.2018, 10:45
    #39704071
Джек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление связи с сервером
Вот весь код:
static void* reconnect_thread(gpointer data)
{
while(1)
{
if(!dl->TestConnect(NULL))
log("Нет соединения с базой данных.");
else
log("Есть соединение с базой данных.");
g_usleep(1000000);
}
}
.
Когда запускаю, через секунду выводятся сообщения "Есть соединение с базой данных.".
Когда выдёргиваю кабель - ни одного сообщения "Нет соединения с базой данных." не появляется.
Вот это:
ConnectionTimeout = 180 (умолчание),
наверно таймаут соединения, а не выполнения запроса.
...
Рейтинг: 0 / 0
18.09.2018, 11:00
    #39704089
Джек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление связи с сервером
Так и есть.
ConnectionTimeout = 180 - на стороне сервера, в файле firebird.conf.
...
Рейтинг: 0 / 0
18.09.2018, 11:05
    #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
18.09.2018, 11:14
    #39704105
Джек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление связи с сервером
Ладно, будут сначала пинговать, а потом запросом проверять.
Есть вероятность, что при успешном пинге выдаст всё-таки ошибку при неудачном запросе.
...
Рейтинг: 0 / 0
18.09.2018, 11:31
    #39704119
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Восстановление связи с сервером
Джек,

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

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

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


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