4

背景:
SQL Native Client で ODBC を使用して SQL Server 2000 データベースと対話するための接続を確立する、C++ でコーディングされたプログラムを使用しています。

問題:
オブジェクトがインスタンス化されたときに接続を開き、オブジェクトが破棄されたときに接続を閉じるオブジェクトに接続が抽象化されます。オブジェクトが破棄されていることがわかります。デストラクタが起動し、これらのデストラクタの内部でSQLDisconnect( ConnHandle )呼び出されSQLFreeHandle( SQL_HANDLE_DBC, ConnHandle ); ています。ただし、sp_Who2SQL でまたはパフォーマンス モニターを使用して接続数を監視すると、これらの接続にもかかわらず、接続数が容赦なく増加していることがわかります。破壊されています。

これは、これらのオブジェクトを数千、つまり数千の接続を作成するのに十分長く実行される一連の関数を実行するまで、問題がないことが証明されています。

質問:
このようなものを見たことがありますか? 何が原因でしょうか? 私の最初の Google 検索はあまり実りがありませんでした。

編集:エラーなしで返されること
を確認しました。SQLDisconnect

接続プーリングはオフです。実際、 を使用して有効にしようとするとSQLSetEnvAttr、 への 2 回目の呼び出しが行われたときにアプリケーションがクラッシュしますSQLDriverConnect

4

3 に答える 3

2

接続プーリングを使用していないことを確認してください。オンにすると、開かれた接続を一定時間 (構成可能) キャッシュします。

接続プールを使用していない場合は、SQLDisconnect() の戻り値を確認する必要があります。SQL Disconnect() が接続を解放しないトランザクションの実行またはロールバックが発生している可能性があります。

MSDNで SQLDisconnect エラーを確認する方法の詳細があります。

于 2008-12-22T22:47:19.140 に答える
1
    sqlncli!CCriticalSectionNT::Enter
    sqlncli!SQLFreeStmt
    sqlncli!SQLFreeConnect
    sqlncli!SQLFreeHandle
    odbc32!UnloadDriver
    odbc32!FreeDbc
    odbc32!DestroyIDbc
    odbc32!FreeIdbc
    odbc32!SQLFreeConnect
    mfc42!CDatabase::閉じる
    mfc42!Cデータベース::無料
    mfc42!CDatabase::~CDatabase

スタックトレースに底がないことから、CDatabase がグローバル変数であると想定できますか? おそらくdllで?

グローバル変数のデストラクタ内から SQL Server から切断しようとすると、正確な症状が見つかりました。

MDAC ODBC ドライバーを使用すると、正常に機能します。デストラクタからコードを移動すると、正常に機能します。

DllMain内から呼び出されるのを好まないSQLネイティブクライアントと関係があるようです。

于 2012-04-17T01:33:02.750 に答える
1

SQL ネイティブ クライアント API を直接使用するのではなく、MFC と ODBC を使用するアプリケーションでも同じ問題が発生したと思います。シャットダウン時にアプリケーションがハングすることがあります。スタック トレースは次のとおりです。

sqlncli!CCriticalSectionNT::Enter
sqlncli!SQLFreeStmt
sqlncli!SQLFreeConnect
sqlncli!SQLFreeHandle
odbc32!UnloadDriver
odbc32!FreeDbc
odbc32!DestroyIDbc
odbc32!FreeIdbc
odbc32!SQLFreeConnect
mfc42!CDatabase::閉じる
mfc42!Cデータベース::無料
mfc42!CDatabase::~CDatabase

できる限り試してみてください。そのようなハングを引き起こす可能性のあるものは何も見つかりません。誰かが解決策を提案できれば幸いです。他の人が同様の問題をオンラインで見たようですが、今日まで解決策は見つかりませんでした.

于 2009-03-25T16:47:24.820 に答える