SQL Serverの接続プール

オリジナル: SQL Serverの接続プール

接続プールは、それは何ですか?
プログラムが読み込まれ、データベースに書き込む必要があるたびに。Connection.Open()は、データベースに接続できるように、ConnectionStringを使用するデータベースは、プログラムのための接続を確立すると、プログラムがデータベースを更新/照会するT-SQLステートメントを使用することができた後、開いたままになります。Connection.Close()を実行するとき、データベースは、現在の接続を閉じます。まあ、すべてのルックスはとても整然としたです。

HTTP要求はサーバーに送信されたときに、私のプログラムは、例えば、(例えばASP.NetやWebサービスなど)の接続を開閉するタイミングする必要がない場合でも,,私たちは、接続をオープンし、その後のDataTableを返します。表から選択*を使用する必要があります/クライアント/ブラウザへのDataSet、その後、現在の接続を閉じます。システム全体のすべてのオープン/クローズコネクションので、頻繁に操作は間違いなく無駄になること。

ADO.Netチームがより良い解決方法を提供します。以前に保存した接続、次回はするとき、次の接続への以前の接続の接続を開く必要があります。これは、接続プールです。

 

接続プールがどのように働きますか?
プログラムはConnection.openを()が実行されるとまず、ADO.netを判断する必要があり、この接続はサポートして接続プール(プーリングデフォルトはTrueで)あなたはFalseを指定した場合、ADO.netは(のためのデータベースとの接続の間に作成されます混乱を避けるために、すべてのデータベースに接続し、その後、プログラムに戻ります)「接続」の記述を使用しています。

Trueを指定した場合、ADO.netはConnectStringのは、接続プールを作成し、接続プールへの接続を記入(すべての接続.NETのプログラム、「接続」の記述を使用)基づいて行われます。ミンプールサイズによって決定される数を埋めるために、接続のプロパティ(デフォルトは0です)。5が指定されている場合、例えば、ADO.netオープンSQLデータベース5との間の時間は、接続プール、戻り接続に格納されて接続され、接続4、です。


プログラムは、Connection.close()のために実行される場合。確かに、ADO.net現在の接続を入れて、接続データベースとの間で開催されている場合プーリング接続プールが置かれています。

また、接続の寿命を決定しながら、時間がConnection接続寿命を超えて存在する場合0は、無限大を表し、特性(デフォルトは0である)、ADO.net接続は、接続に戻ってそれを保存するのではなく、データベースへの接続から切断しながら、閉鎖されでプール。
(これは主に、SQLデータベースのクラスタリング、ロードバランシングの目的で使用されています)。プールがFalse指定された場合は、データベースとの間で直接切断。


その後、次回時間のConnection.Open()の実装は、ADO.Net接続は、以前に接続プールに格納された新しいのConnectionStringれたconnectionStringが一貫しているかどうかを決定します。

(ADO.NetのConnectionStringは新しいのConnectionStringが正確にさえに接続プールに保存された接続ののConnectionStringと一致する必要があり、そう言って、バイナリストリームに変わる余分なスペースを追加、または接続文字列で特定の属性を変更しますあなたは、SQLを使用している場合は、接続につながるパスワードを変更し、順序がADO.Netは、これが新しい接続だと思うようになります、そしてあなたはユーザーID、パスワードの認証方法を使用しているので、もし、新しい接続を再作成します統合認証は、あなたがそれを用いた2つの接続)を保存する必要があります。
(他のプログラムによって使用されていない)が用いられる現在の接続プール接続かどうかではない場合に接続場合、(デフォルトは100)ADO.net最大プールサイズのConnectionString設定を決定する必要があるかを決定することが必要ADO.net最大プールサイズに到達していないすべての接続プールは、ADO.netは、接続を作成するために、再度データベースに接続し、その後接続プログラムに戻ります。
あなたがMaxPoolSizeに達している場合は、ADO.netは再び新しい接続を作成しますが、接続プールを待つことはありませんまた、制限(デフォルトは15秒です)SqlConnection.ConnectionTimeoutにより、他のプログラムの接続解除することによって、この待ち時間を占有しています15秒以上場合には、ある、SqlConnectionオブジェクトは、その時々SqlConnection.open()メソッドは、タイムアウトエラーをスローした場合に接続プールの数に達しながら、一つの可能​​な理由は、全くタイムリーConnnection以前近いがないことである(エラーをスローしますMaxPoolSize。)
1は、直接プログラムに戻されていない接続プールの接続から取り外し可能な接続である場合は、ADO.netもConnectionReset ConnectionStringプロパティ(デフォルトはTrueで)最も時間接続リセットの必要性を確認する必要があります。例えば、現在の接続を変更するSqlConnection.ChangeDatabaseメソッドを使用し、改変されていてもよいプログラム接続から戻る前に、接続が初期カタログデータベースに指定されていない現在の接続文字列に接続されている可能性が返されるからです。現在の接続をリセットする必要があります。しかし、すべての余分なチェックのためには、システム上ADO.net接続プールのオーバーヘッドが増加します。
 
アプリケーションプールの占有の閲覧数:
DBID = DB_ID( 'データベース名')/コード]のsysprocessesからSELECT * [コード= SQL]
最大プールサイズ:既定では、32,767の理論上の最大値を100に設定されていない場合。データベース接続要求は、この数を超えた場合は接続の最大数は、接続プールの最大数を適用することができますされ、データベースの接続要求は、後続のデータベース操作に影響を与えます待ちキューに後から追加します。キューでは、デフォルトの時間は、サーバ15秒への接続を待機します。
中国のエラー:
タイムアウト期間が経過しました。タイムアウトの有効期限が切れますが、プールから接続を取得します。すべてのプールされた接続を使用していたと最大プールサイズに達したため、このような状況であってもよいです。
英語のエラー:
タイムアウト期間が経過しました。タイムアウト期間がプールから接続を取得する前に経過しました。すべてのプールされた接続を使用していたと最大プールサイズに達したため、これが発生した可能性があります。 
問題の説明:我々は、接続異常が最大接続プールを超えて生成するものとして得ます。接続は、通常、100の最大値をプーリング。我々は、接続が最大値を超え得るとき、例外としてスローされますリターン接続タイムアウトを待っているADO.NET接続プール、
解決策:最初の事は後に、我々はすぐに接続を使用して接続を閉じることです。あなたが接続を終了しない場合、接続は接続プールに保存されますGCを破壊することを知っています。動的プール内の接続の最大数を拡張するために接続されている。この場合、あなたは、私たちは、文字列最大プールサイズ= Nを接続することができ、実際には最大接続プールに到達していない接続プールは、第二に最大に達していると思いました。

説明: 
つまり、たconnectionString最大プールサイズの値が指定されていない場合は、最大プールサイズ= 100、とき同時にデータベース101人に接続するために、人へのアクセス数、SqlConnection.ConnectionTimeout(デフォルト15秒)提供待機時間、接続が利用可能かどうか、上記のエラーになります。
我々は設定した場合:
"サーバー=(ローカル);統合セキュリティ= SSPI;データベース= Northwindの;最大プールサイズ= 512;分プールサイズ= 5"。アクセス人事データベースへの同時接続数が513になった後、(デフォルトは15秒です)待ち時間SqlConnection.ConnectionTimeoutを設定しない、または利用可能な接続は、エラーの上になります。

おすすめ

転載: www.cnblogs.com/lonelyxmas/p/11229038.html