Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
13.11.2015, 16:19
|
|||
|---|---|---|---|
|
|||
occi подвисает при подключении к серверу |
|||
|
#18+
Добрый день. Несколько дней бьюсь с проблемой, никак не получается решить. В форуме по oracle посоветовали написать и сюда тоже. Пишу на чистом C++, без каких либо дополнительных библиотек, и для работы с oracle использую occi. Работаю следующим образом: в начале при инициализации приложения делаю: Код: plsql 1. 2. 3. далее у меня создается несколько потоков, в которых я переодически делаю так: Код: plsql 1. 2. 3. 4. 5. В нормальной ситуации все работает хорошо. Но если например перезагрузить сервер в момент когда выполняется запрос, то этот поток у меня подвисайт, и ошибки не вылетает. Подключившись дебагером, и посмотрев в каком месте подвис поток, я увидет что работа стоит в библиотеке ws2_32.dll Мною было замечено, что подвисает на вызове connPool->createConnection(Config::OracleUser, Config::OraclePassword); возможно ли как-то еще задавать timeout? Или может быть я вообще что-то делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.11.2015, 16:56
|
|||
|---|---|---|---|
occi подвисает при подключении к серверу |
|||
|
#18+
Тут конечно вопросом по С++ и не пахнет, но всё же... vint15Но если например перезагрузить сервер в момент когда выполняется запрос, то этот поток у меня подвисайт, и ошибки не вылетает. конкретнее, что и когда ты перегружаешь. Сервер, где этот твой процесс работает, или сервер СУБД? vint15Подключившись дебагером, и посмотрев в каком месте подвис поток, я увидет что работа стоит в библиотеке ws2_32.dll Мною было замечено, что подвисает на вызове connPool->createConnection(Config::OracleUser, Config::OraclePassword); возможно ли как-то еще задавать timeout? Тайм-аут-то задавать можно, проблема в другом -- далеко не всегда таймауты работают. vint15Или может быть я вообще что-то делаю не так? Да вроде пока криминала нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.11.2015, 17:01
|
|||
|---|---|---|---|
|
|||
occi подвисает при подключении к серверу |
|||
|
#18+
MasterZivконкретнее, что и когда ты перегружаешь. Сервер, где этот твой процесс работает, или сервер СУБД? Тайм-аут-то задавать можно, проблема в другом -- далеко не всегда таймауты работают. Перезагружаю сервер СУБД. А какие таймауты не всегда работают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.11.2015, 17:13
|
|||
|---|---|---|---|
occi подвисает при подключении к серверу |
|||
|
#18+
vint15MasterZivконкретнее, что и когда ты перегружаешь. Сервер, где этот твой процесс работает, или сервер СУБД? Тайм-аут-то задавать можно, проблема в другом -- далеко не всегда таймауты работают. Перезагружаю сервер СУБД. А какие таймауты не всегда работают? Сетевые. И все, на них основанные. Я думаю, тебе не стоит заморачиваться над решением этой проблемы, просто при перегрузке СУБД нужно сначала выключить твой сервис, потом поднять СУБД, потом включить твой сервис. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.11.2015, 17:30
|
|||
|---|---|---|---|
|
|||
occi подвисает при подключении к серверу |
|||
|
#18+
MasterZivЯ думаю, тебе не стоит заморачиваться над решением этой проблемы, просто при перегрузке СУБД нужно сначала выключить твой сервис, потом поднять СУБД, потом включить твой сервис. У меня требование к отказоустойчивости очень сильное, на сервере может просто выключится питание. Мне хотелось бы как-то в таком случае получить ошибку. И в случае разрыва сети, тоже нужно получать ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
14.11.2015, 01:43
|
|||
|---|---|---|---|
occi подвисает при подключении к серверу |
|||
|
#18+
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. Тоже как то сталкивался со слишком долгим "умиранием" подключение. Оказалось, что на уровне протокола был установлен длительный период ожидания, на предмет, вдруг связь восстановится? И в общем клиент мог долго ждать ответа от сервера, тогда как сетевой кабель был отключен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.11.2015, 10:24
|
|||
|---|---|---|---|
occi подвисает при подключении к серверу |
|||
|
#18+
Вот наш опыт в конторе говорит, что лучше не использовать пулы OCI, лучше сделать самому руками. Но это дело десятое, а по таймаутам -- даже если его установить правильно, в смысле, найти другой, не факт, что он будет работать. Если нужен 100% ный тайм-аут -- его нужно делать самому, в виде вызова в фоновом потоке и отмера времени на этот вызов. Это всегда будет работать. Чтобы работал тайм-аут на TCP, нужжно, чтобы установка соотв. свойства TCP было протащено через API, или чтобы наоборот через API можно было бы вытащить TCP-хендл соединения, а обычно создатели API это не любят, потому что у них много сетевых протоколов под ними лежат. Затем надо установить этот таймаут, но и в этом случае он будет работать не всегда, потому что в сетях со всякими файрволами и сетевыми фильтрами таймауты могут просто не работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.11.2015, 10:26
|
|||
|---|---|---|---|
occi подвисает при подключении к серверу |
|||
|
#18+
vint15, Вот тут в помощь... http://stackoverflow.com/questions/1726512/how-can-i-set-the-timeout-on-ocilogon2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&tablet=1&tid=2018739]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
159ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 303ms |
| total: | 554ms |

| 0 / 0 |
