2009-05-22 13 views
5

それは.NETアプリケーション内の1つの共有SqlConnectionオブジェクトは、データベース接続のすべてに使用するか、あなたがデータベースにアクセスする別の1時間ごとを持っている必要があり持っていることをお勧めますか?共有SqlConnectionの

私は現在、共有しているものがあり、突然問題に遭遇しているようです。 Windows認証モードではなくSQL認証モードを使用する必要がある場合は、共有アカウントを使用できないようです。私はSQL認証を初めて使用しようとしましたが、同じ接続をもう一度試してみると、このエラーが表示されました:

このコマンドに関連付けられている開いているDataReaderがあります。

答えて

4

本当に別のものが必要です。接続の再利用はconnection poolingで処理されます。おそらく、MARSを有効にすることで解決できると言われているような2番目の問題があります。

0

SQL Server 2000を使用している場合、thisは、あなたの質問に答えることがあります。

「これはMARのデフォルト設定が変更されているためです。以前はデフォルトでオンになっていましたが、RC1のデフォルトでオフに変更しました。それを元に戻してください(MultipleActiveResultSets = Trueを接続文字列に追加してください)。

1

これの多くはdup from hereであってもよく、一言で言えば、ほとんどの状況下では接続を短期間かつローカルに保ちます。データリーダーを再起動します。おそらくMARSを有効にしますか?

1

単一のスレッドの場合、単一のSqlConnectionオブジェクトを使用する方がパフォーマンスが向上する可能性があります。接続にハングアップしてデータベースサーバーである貴重なリソースに必要な時間以上のdbサーバーリソースが必要です。

できるだけ短時間SqlConnectionをインスタンス化する方が良いです。接続プーリングは接続の設定の費用の大部分を軽減し、データベース・リソースの最も効率的な使用を保証します。

3

このエラーは、認証とはまったく関係ありません。 ExecuteReader()から返されたSqlDataReaderを閉じる前に、途中から接続を再利用しています。これは禁止されています。コードをチェックして問題を解消する必要があります。 MARS(multiple active record sets)を使用する選択肢がありますが、私はそれを強く推奨しません。どうやらあなたが使用してときに何であるかを接続わからないので、そうあなたは、トランザクションの整合性の問題に実行されます別々の接続を使用しますときに、アプリケーションで複数の接続を使用して

はおそらくさえ悪くなります。

+0

「MARSを使用しない」と言っている場合は、具体的な理由はありますか?好奇心から... –

+0

http://blogs.msdn.com/sqlnativeclient/archive/2006/09/27/774290.aspxでは、MARSの使用に関するいくつかのネガティブについて説明しています – RichardOD

+2

MARSのトランザクション分離モデルは不完全です。理論的には完全には定義されていません。その結果、Richardが投稿したリンクが認めているように、サーバーが「混乱」する可能性があります。 「混乱」とは通常、可能な対話の数が多すぎるため、サーバー内のすべてのコードパスがテストされ、検証されるわけではありません。 –

2

問題は、現在SqlDataReaderで使用されている接続を使用しようとしていることです。あなたはそれをすることはできません。 SqlDataReaderを使用する場合は、消費されている接続を再利用する前にSqlDataReaderを閉じる必要があります。 DBにアクセスするたびに(いつでも、SqlDataReadersだけでなく)異なる接続を作成することをお勧めします。プーリングが有効になっている場合、フレームワーク自体(またはSqlServer?)は可能な場合に接続を再利用します。

DBに順番にアクセスする必要がある場合は、選択し、別の選択を行い、次に更新を行い、接続(つまり、同じSqlConnectionインスタンス)を再利用することができますが、 SqlDataReaderから読み込み中のDBは、2つの異なる接続が必要です。

もちろん、並行性の問題を念頭に置く必要があります。トランザクションを使用する場合、特定の操作中に一部のレコードがロックされ、他のクエリと並行してSqlDataReaderを使用する場合、残りのクエリを混乱させないレベルに分離レベルを設定する必要があります。