|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Добрый день всем! У меня клиент связывается с сервером с помощью библиотеки 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, как-то отловить аварийную потерю связи? Или может ещё какой-нибудь способ есть? Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 09:41 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
...чё-то у меня тут лишнее скопировалось... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 09:44 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Джек, код надо было оформлять в тегах Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 09:51 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 10:01 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
ДжекНо когда выдёргиваю кабель, программа просто виснет на выполнении запроса (qtestconnect->exec(st)) и не попадает ни в блок else, ни в блок catch. Ну пока она висит уж точно не попадёт ни в какой блок. Для начала добейся чтобы программа быстрее реагировала на то что ты выдернул кабель. См. параметр ConnectionTimeout = 180 (умолчание) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 10:14 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Симонов ДенисConnectionTimeout = 180 У какого класса это параметр? Я не нашёл, ни у TIBPPQuery, ни у IBPP::DatabaseFactory. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 10:23 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
...даже если так: ConnectionTimeout = 180 (умолчание), то это тоже не работает - программа не три минуты висит, а навсегда. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 10:26 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
...мне со стороны клиента нужно отловить, а не со стороны сервера. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 10:28 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Джек, это параметр уровня коннекта Firebird. Как его там установить в IBPP ХЗ. Ну наверное через isc_dpb можно. Если висит навсегда, то надо отлаживать ваш код, возможно где-то зацикливание ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 10:29 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Дёргать сервер в отдельном потоке - плохая идея. Ибо он может ответить там, но через секунду связь оборвётся и основной поток получит сообщение об ошибке. Которое в любом случае нужно корректно обработать. Так что отдельный поток никак не избавляет от этой необходимости. PS Насчёт "зависания навсегда" - читай про keepalive. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 10:44 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Вот весь код: static void* reconnect_thread(gpointer data) { while(1) { if(!dl->TestConnect(NULL)) log("Нет соединения с базой данных."); else log("Есть соединение с базой данных."); g_usleep(1000000); } } . Когда запускаю, через секунду выводятся сообщения "Есть соединение с базой данных.". Когда выдёргиваю кабель - ни одного сообщения "Нет соединения с базой данных." не появляется. Вот это: ConnectionTimeout = 180 (умолчание), наверно таймаут соединения, а не выполнения запроса. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 10:45 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Так и есть. ConnectionTimeout = 180 - на стороне сервера, в файле firebird.conf. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 11:00 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Джек, автор# ---------------------------- # Client Connection Settings (Basic) # # Seconds to wait before concluding an attempt to connect has failed. # # Per-connection configurable. # # Type: integer # #ConnectionTimeout = 180 ну скорее всего да, это тайм-аут установки самого коннекта, но вот только это Per-connection ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 11:05 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Ладно, будут сначала пинговать, а потом запросом проверять. Есть вероятность, что при успешном пинге выдаст всё-таки ошибку при неудачном запросе. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 11:14 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Джек, какая у тебя конечная цель ? Зачем всё это ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 11:31 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
hvladкакая у тебя конечная цель ? Зачем всё это ? Автоматическое восстановление связи - у сервера электричество пропадает. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:06 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Джек, у сервера? Так тут уже ничего не поможет. Или может просто на свитчах/роутерах пропадает питание? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:16 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Симонов Денис Или может просто на свитчах/роутерах пропадает питание? Может быть. Я не сисадмин. Мне сисадмин сказал что-то про отключение. И что надо сделать восстановление... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:20 |
|
Восстановление связи с сервером
|
|||
---|---|---|---|
#18+
Джекhvladкакая у тебя конечная цель ? Зачем всё это ? Автоматическое восстановление связи - у сервера электричество пропадает.И каким боком тут фоновый поток и прочие извраты ? Если связь пропадёт, когда основной поток выполняет запрос - чем тут поможет фоновый ? Зачем это всё ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2018, 12:44 |
|
|
start [/forum/topic.php?fid=40&msg=39704036&tid=1560977]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 153ms |
0 / 0 |