Приложение ODBC для собственного клиента SQL не отключается после SQLDisconnect и не создает пул? - PullRequest
3 голосов
/ 23 декабря 2008

Справочная информация:
Я работаю с программой, написанной на C ++, которая использует ODBC для собственного клиента SQL для установления соединений для взаимодействия с базой данных SQL Server 2000.

Проблема:
Мои соединения абстрагируются в объект, который открывает соединение, когда создается объект, и закрывает соединение, когда объект уничтожается. Я вижу, что объекты разрушаются: их деструктор запускается, и внутри этих деструкторов вызывается SQLDisconnect( ConnHandle ), за которым следует SQLFreeHandle( SQL_HANDLE_DBC, ConnHandle ); Однако, наблюдая за подсчетом соединений с помощью sp_Who2 или Performance Monitor в SQL показывает количество соединений увеличивается без смягчения, несмотря на то, что эти соединения разрушаются.

Это не оказалось проблематичным до тех пор, пока не была выполнена цепочка функций, которая выполняется достаточно долго для создания нескольких тысяч таких объектов и, как таковых, нескольких тысяч соединений.

Вопрос:
Кто-нибудь видел что-нибудь подобное раньше? Что может быть причиной этого? Мои первые поиски в Google не оказались очень плодотворными!

EDIT:
Я подтвердил, что SQLDisconnect возвращается без ошибок.

Пул соединений отключен. Фактически, когда я пытаюсь включить его с помощью SQLSetEnvAttr, мое приложение вылетает при втором вызове SQLDriverConnect.

Ответы [ 3 ]

2 голосов
/ 23 декабря 2008

Убедитесь, что вы не используете пул соединений. Если он включен, он будет кэшировать открытые соединения в течение некоторого (настраиваемого) времени.

Если вы не используете пул соединений, вы должны проверить возвращаемое значение SQLDisconnect (). У вас может быть выполнение или откат какой-либо транзакции, которая не позволит SQL Disconnect () освободить ваше соединение.

Более подробную информацию о том, как проверить ошибки SQLDisconnect, можно получить по адресу MSDN .

1 голос
/ 17 апреля 2012
    sqlncli!CCriticalSectionNT::Enter
    sqlncli!SQLFreeStmt
    sqlncli!SQLFreeConnect
    sqlncli!SQLFreeHandle
    odbc32!UnloadDriver
    odbc32!FreeDbc
    odbc32!DestroyIDbc
    odbc32!FreeIdbc
    odbc32!SQLFreeConnect
    mfc42!CDatabase::Close
    mfc42!CDatabase::Free
    mfc42!CDatabase::~CDatabase

Исходя из того, что у вашей трассировки стека нет дна, можем ли мы считать, что база данных CD является глобальной переменной? Возможно в dll?

Мы нашли ваши точные симптомы, если пытались отключиться от SQL Server из деструктора глобальной переменной.

Использование драйверов MDAC ODBC работает успешно. Удаление кода из деструктора работает успешно.

Кажется, что-то связано с собственным клиентом sql, которому не нравится, когда его вызывают изнутри DllMain.

1 голос
/ 25 марта 2009

Мне кажется, я видел ту же проблему в приложении, использующем MFC и ODBC, а не непосредственно клиентский API-интерфейс SQL. Иногда мое приложение зависает при завершении работы, трассировка стека:

sqlncli!CCriticalSectionNT::Enter
sqlncli!SQLFreeStmt
sqlncli!SQLFreeConnect
sqlncli!SQLFreeHandle
odbc32!UnloadDriver
odbc32!FreeDbc
odbc32!DestroyIDbc
odbc32!FreeIdbc
odbc32!SQLFreeConnect
mfc42!CDatabase::Close
mfc42!CDatabase::Free
mfc42!CDatabase::~CDatabase

Как ни старайся, я не вижу ничего, что могло бы вызвать такое зависание. Буду признателен, если кто-нибудь может предложить решение. Похоже, что другие видели подобные проблемы онлайн, но на сегодняшний день я не нашел никакого решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...