OLE DB には、現在の接続がビジー状態の場合、黙ってデータベース接続をさらに開くという卑劣な機能があります。
- これらはあなたの知らないうちに起こります
- また、それらは接続プールから取得されたり、接続プールに返されたりしません
Microsoftは、SQL Server 2005 の「ネイティブ クライアント」で、1 つの接続で複数のアクティブ レコード セットをサポートできる機能を導入しました。これにより、 1 つの接続で複数のレコードセットを正式にアクティブにすることができます。しかし、彼らはそれを有効にするのは難しいことだと指摘しており、それがこの機能のベータ 2 からオプトインされている理由です。
秘密のつながり?本当に?
Microsoftは、この動作について次のように述べています。
SQL Server Native Client での ADO の使用
以前のバージョンの OLE DB プロバイダーでは、1 つの接続ごとに 1 つのアクティブな結果セットしか開くことができなかったため、このコードによって 2 回目の実行時に暗黙的な接続が作成されました。暗黙的な接続は OLE DB 接続プールにプールされていないため、追加のオーバーヘッドが発生します。SQL Server Native Client OLE DB プロバイダーによって公開される MARS 機能を使用すると、1 つの接続で複数のアクティブな結果を取得できます。
また、Microsoft フォーラムで John C. Gordon [MSFT] によって言及されています: (アーカイブ)
OLE DB には、アクティブな結果セットがまだ保留中にクエリが実行されると生成される "暗黙的な接続" と呼ばれるものがあります。元の投稿者が気づいたように、これらはユーザーにはわかりません。SQLNCLI、SQLNCLI10 がこれらを実装していることは知っていますが、SQLOLEDB が実装しているかどうかは覚えていません。次に何が起こるかというと、サーバーには 2 つの接続があり、それぞれに 1 つの保留中の結果セットがあります。選択したライセンス モデルが接続によるものである場合、これは不快です。
MARS の発表ブログ エントリ にも記載されています: (アーカイブ)
MARS を SQL Native Client で使用する [Chris Lee]
2 番目の結果セットは、開くたびに新しい接続を使用しています。これには明らかにいくらかのオーバーヘッドがあります (そして、追加の接続がプールされていないことが判明したため、オーバーヘッドは毎回完全なサーバー接続ネットワーク プロトコル交換に対するものです)。これは、SQLOLEDB および SQL Native Client (OLE DB) の既定の動作です。既定の結果セットでメイン接続がビジー状態になると、新しい暗黙的な接続が生成されます。
これは、データ アクセスを容易にするために設計された、OLE DB の奥深くにある機能です。
ボーナスおしゃべり
- OLE DB は低レベルで複雑な API です
- ADO は OLE DB の単純化されたラッパーです
オフにする方法は?
この二次接続の自動作成は明らかに良くありません。SQL Server ODBC ドライバーがそれを行わないのは良くありません (これは OLE DB の奥深くにある機能であり、SQL Server の OLE DB ドライバーに無料で付属しているためです。ODBC 内の機能ではありません)。
していないことを確認したい。この目的のために、誤ってこれを実行しようとしたコード内のポイントでドライバーがエラーをスローするようにします。
OLE DB の暗黙的な追加接続をオフにするにはどうすればよいですか?