ODBC, SQL: как "грамотнее" выполнить переконнект п

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Ситуация следующая.
Есть программа (мной писанная), которая висит на компе (дооолго) и делает "свои дела". Т.е. после запуска работает без какого-то участия пользователя.
И при работе время от времени немножко лазает в оракловую базу данных.
Это "лазание" я сделал через SQL-WinAPI-функции (SQLAllocHandle, SQLDriverConnect, SQLExecute и т.п.) (если спросите "почему так?", отвечу: когда-то пользовался этими функциями, т.е. как бы уже был "знакомый путь", и путь, в общем, работающий :) )

В общем, в "штатной ситуации" все работает.
Но начальству хотелось бы, чтобы программа, в случае возникновения сбоя в связи с СУБД (ну, вдруг какому-нибудь админу шнурок понадобиться переткнуть) сама восстанавливала соединение и продолжала работать.
И вот тут начинается веселуха.

У меня есть хэндел соединения (hdbcDB), полученный функцией
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbcDB),
на который следан коннект (функция SQLDriverConnect (hdbcDB, ...)).

Итак. Связь разорвана (моделирую это, выдергивая шнур из сетевой платы). Если я пытаюсь выполнить SQLDisconnect (hdbcDB), то получаю ошибку (со смыслом: нет соединения).
Более того, даже если связь (физически) восстановлена (я воткнул сетевой шнур обратно), то все равно SQLDisconnect (hdbcDB) не выполняется.
Попытка освободить этот хэндл (SQLFreeHandle(SQL_HANDLE_DBC, hdbcDB)) также дает ошибку "Нарушение последовательности действий" (намекая, что не выполнен SQLDisconnect).
Если же я просто пытаюсь опять выполнить SQLDriverConnect (hdbcDB, ...), то получаю ошибку "Это соединение уже используется".

В общем, получается какой-то замкнутый круг :( Операции Б и В нельзя выволнить, потому что не выполнена операция А, а операция А выполняться не хочет :(

В конце концов, можно, наверное, плюнуть на этот "зависший" хэндл соединения (hdbcDB) и выделить новое соединение и работать с ним. Но как-то это некрасиво получается: оставлять "незачищенные хвосты".

Быть может, кто-то что-то посоветует? Вроде, все функции из этого раздела (SQLxxxxxxx) просмотрел, но никаких идей не возникло...

Заранее спасибо.
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

Все так делают. Плюют на "Зависший Handle". Да, это потенциальный memory leak. Но прога твоя сдохнет только в тому случае, если пару-тройку тысяч раз в день Oracle бутиться будет.

Прога работает 24-7 или запускается по утрам?
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

DeeJayC, спасибо за ответ.

Я так понимаю, планируется, что запуск НЕ будет привязан к какому-то времени. То есть, если все нормально, то может и "сутками работать".
DeeJayC писал(а):Все так делают. Плюют на "Зависший Handle". Да, это потенциальный memory leak. Но прога твоя сдохнет только в тому случае, если пару-тройку тысяч раз в день Oracle бутиться будет.
Ну, в общем, наверное, в самом деле "лавины" рассоединений не будет :)

Кстати, небольшой прикол еще и в том, что, как я понимаю, при "зависших" connection-хэндлах, программа не сможет и завершиться "корректно". Так как освобождение environment-хэндла (SQLFreeHandle(SQL_HANDLE_ENV, henv)) также выдает ошибку "Нарушение последовательности действий".
Ответить