Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / occi подвисает при подключении к серверу / 8 сообщений из 8, страница 1 из 1
13.11.2015, 16:19
    #39103085
vint15
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
occi подвисает при подключении к серверу
Добрый день.
Несколько дней бьюсь с проблемой, никак не получается решить. В форуме по oracle посоветовали написать и сюда тоже.
Пишу на чистом C++, без каких либо дополнительных библиотек, и для работы с oracle использую occi.
Работаю следующим образом:
в начале при инициализации приложения делаю:

Код: plsql
1.
2.
3.
OracleEnvironment = oracle::occi::Environment::createEnvironment(oracle::occi::Environment::THREADED_MUTEXED);
connPool = OracleEnvironment->createConnectionPool(user, password, db, 1, Config::Count + 1, 1);
connPool->setTimeOut(20);



далее у меня создается несколько потоков, в которых я переодически делаю так:

Код: plsql
1.
2.
3.
4.
5.
connPool->createConnection(Config::OracleUser, Config::OraclePassword);
oracle::occi::Statement *stmt = conn->createStatement();
oracle::occi::Statement::Status s = stmt->execute(Command);
conn->terminateStatement(stmt);
connPool->terminateConnection(conn);




В нормальной ситуации все работает хорошо.
Но если например перезагрузить сервер в момент когда выполняется запрос, то этот поток у меня подвисайт, и ошибки не вылетает.
Подключившись дебагером, и посмотрев в каком месте подвис поток, я увидет что работа стоит в библиотеке ws2_32.dll
Мною было замечено, что подвисает на вызове connPool->createConnection(Config::OracleUser, Config::OraclePassword);
возможно ли как-то еще задавать timeout?
Или может быть я вообще что-то делаю не так?
...
Рейтинг: 0 / 0
13.11.2015, 16:56
    #39103116
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
occi подвисает при подключении к серверу
Тут конечно вопросом по С++ и не пахнет, но всё же...

vint15Но если например перезагрузить сервер в момент когда выполняется запрос, то этот поток у меня подвисайт, и ошибки не вылетает.


конкретнее, что и когда ты перегружаешь. Сервер, где этот твой процесс работает, или сервер СУБД?

vint15Подключившись дебагером, и посмотрев в каком месте подвис поток, я увидет что работа стоит в библиотеке ws2_32.dll
Мною было замечено, что подвисает на вызове connPool->createConnection(Config::OracleUser, Config::OraclePassword);
возможно ли как-то еще задавать timeout?


Тайм-аут-то задавать можно, проблема в другом -- далеко не всегда таймауты работают.

vint15Или может быть я вообще что-то делаю не так?

Да вроде пока криминала нет...
...
Рейтинг: 0 / 0
13.11.2015, 17:01
    #39103124
vint15
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
occi подвисает при подключении к серверу
MasterZivконкретнее, что и когда ты перегружаешь. Сервер, где этот твой процесс работает, или сервер СУБД?

Тайм-аут-то задавать можно, проблема в другом -- далеко не всегда таймауты работают.

Перезагружаю сервер СУБД.
А какие таймауты не всегда работают?
...
Рейтинг: 0 / 0
13.11.2015, 17:13
    #39103139
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
occi подвисает при подключении к серверу
vint15MasterZivконкретнее, что и когда ты перегружаешь. Сервер, где этот твой процесс работает, или сервер СУБД?

Тайм-аут-то задавать можно, проблема в другом -- далеко не всегда таймауты работают.

Перезагружаю сервер СУБД.
А какие таймауты не всегда работают?

Сетевые. И все, на них основанные.

Я думаю, тебе не стоит заморачиваться над решением этой проблемы, просто при перегрузке СУБД нужно сначала выключить твой сервис, потом поднять СУБД, потом включить твой сервис.
...
Рейтинг: 0 / 0
13.11.2015, 17:30
    #39103150
vint15
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
occi подвисает при подключении к серверу
MasterZivЯ думаю, тебе не стоит заморачиваться над решением этой проблемы, просто при перегрузке СУБД нужно сначала выключить твой сервис, потом поднять СУБД, потом включить твой сервис.

У меня требование к отказоустойчивости очень сильное, на сервере может просто выключится питание. Мне хотелось бы как-то в таком случае получить ошибку. И в случае разрыва сети, тоже нужно получать ошибки.
...
Рейтинг: 0 / 0
14.11.2015, 01:43
    #39103319
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
occi подвисает при подключении к серверу
vint15MasterZivЯ думаю, тебе не стоит заморачиваться над решением этой проблемы, просто при перегрузке СУБД нужно сначала выключить твой сервис, потом поднять СУБД, потом включить твой сервис.

У меня требование к отказоустойчивости очень сильное, на сервере может просто выключится питание. Мне хотелось бы как-то в таком случае получить ошибку. И в случае разрыва сети, тоже нужно получать ошибки. Раз все так серьезно, то прочти хотя бы документацию:

setTimeOut()

Set the time-out period, in seconds, for a connection in the connection pool.
This method sets the time-out period for a connection in the connection pool. OCCI will terminate any connections related to this connection pool that have been idle for longer than the time-out period specified.

Это время жизни подключения в пуле, когда оно не используется.

Вероятно, когда подключение в пуле упало, пул начинает перебирать и пытаться восстанавливать подключение до тех пор, пока не найдет живое. Если пул большой, на то может уйти много времени.

Сколько я помню в OCI можно использовать не блокирующий режим. Тогда функция сразу возвращает код "в процессе", и нить может периодически повторять вызов функции, пока та не вернет другой код или когда надоест ждать прервать выполнение методом OCIBreak().

Для блокирующего режима наверное можно создать следящую нить, которая прервет выполнение "зависшей" нити по истечении некоторого таймаута. Насколько я знаю встроенного механизма в OCI нет.

Кроме того таймауты можно установить на уровне TCP/IP. Тоже как то сталкивался со слишком долгим "умиранием" подключение. Оказалось, что на уровне протокола был установлен длительный период ожидания, на предмет, вдруг связь восстановится? И в общем клиент мог долго ждать ответа от сервера, тогда как сетевой кабель был отключен.
...
Рейтинг: 0 / 0
16.11.2015, 10:24
    #39104162
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
occi подвисает при подключении к серверу
Вот наш опыт в конторе говорит, что лучше не использовать пулы OCI, лучше сделать самому руками.

Но это дело десятое, а по таймаутам -- даже если его установить правильно, в смысле, найти другой,
не факт, что он будет работать.
Если нужен 100% ный тайм-аут -- его нужно делать самому, в виде вызова в фоновом потоке и отмера времени на этот вызов.
Это всегда будет работать.

Чтобы работал тайм-аут на TCP, нужжно, чтобы установка соотв. свойства TCP было протащено через API, или чтобы наоборот через API можно было бы вытащить TCP-хендл соединения, а обычно создатели API это не любят, потому что у них много сетевых протоколов под ними лежат.

Затем надо установить этот таймаут, но и в этом случае он будет работать не всегда, потому что в сетях со всякими файрволами и сетевыми фильтрами таймауты могут просто не работать.
...
Рейтинг: 0 / 0
16.11.2015, 10:26
    #39104164
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
occi подвисает при подключении к серверу
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / occi подвисает при подключении к серверу / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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