100を上限とする最大接続プール


27

Windows Server 2008ボックスでSQL Server 2008 R2 SP1を実行しています。Visual Studio 2010から次のことを実行する.NETスクリプトを実行しています。

  • データベースに到達する
  • 変更を加える
  • 繰り返す

繰り返しの合計回数は150回ですが、100の接続で停止しているため、その理由はわかりません。単一のスレッドを使用するようにスクリプトを調整することもできますが、将来の参照のために知っておくと便利なため、最大接続設定がどこにないのかを知りたいと思います。

これまでに確認した場所は次のとおりです。

  • Visual Studio 2010のSQL接続文字列(1000に設定されています)
  • SSMSデータベースインスタンスの接続プロパティ(0 [無限]のユーザー接続に設定されます)
  • Server 2008の情報をGoogleで検索したところ、100を超える接続を処理できるようです
  • SP_WHO2論理接続に関する詳細情報を提供するコードをステップ実行し、接続の数が52で始まり、152の論理接続で「最大プール接続に達しました」というエラーでスクリプトエラーが表示されることを確認しました。
  • 使用する接続文字列を変更しました Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

他にどこを確認すればいいのかわかりません。ここには可動部品がたくさんあることは知っていますが、どこかで最大プール設定が不足しているような気がします。


1
接続文字列を投稿できますか?私の答えをご覧ください。それがあなたの救済策であるはずです(この値は接続文字列で指定されます。 System.Data.SqlClientデフォルトは100であり、これが接続プールの枯渇が見られる理由です)。
トーマスストリンガー

回答:


24

SQL Serverでは、デフォルトで最大32767の接続が許可されています。を使用して変更できますsp_configure。この設定の現在の構成を表示するには、次のクエリを使用します。

select * from sys.configurations
where name ='user connections'

デフォルトでは、value_in_use0 に等しい最大32767が表示されます(デフォルト設定を使用します)。これが変更されている場合は、リンクで説明されている他の値を使用するようにSQL Serverを再構成できます。

また、アプリケーションの外部でより多くのアクティビティが発生している可能性があるため(または、アプリケーションが考えているよりも多くの接続を確立している可能性があるため)、実際に行われている接続の数も確認する必要があります。perfmonで[一般統計]-> [論理接続]を確認するか、次の値をクエリしますsys.dm_os_performance_counters(cntr_valueは現在の時点の値を表示します)。

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'

うん、私はすでにユーザー接続をチェックしました(最初に行ったもので、UIとMicrosoftのドキュメントの両方で見つけるのが最も簡単です。また、コードをステップ実行し、SSMS経由の論理接続の数に注目しました。論理的な接続に関する情報のまともな量を与えるSP_WHO2、アイドリングを使用して、私のサーバーは、51個の接続を持っているスクリプトが失敗した場合、それは100の以上の接続ビルドを持っている私は、私は今の私どこに得ているかということ。。。
ショーン・ロング

私は自分がとったステップで質問をもう少し明確にしました。SQLの設定ではない可能性があるため、WindowsとVisual Studioの設定を見始めました。
ショーンロング

1
すべてを確認しても100接続で失敗する場合、答えはデータベース設定の外にあります。参考までに、これらの51の接続はすべてシステムプロセスです(ご自身で+1)。
マイクファル

最後にコメントを付けるために、最後のコメントは正しいものになりました。100個の接続が作成されている理由を詳しく調べて、コードにリークがあることを発見しました。修正後、問題なく動作します。ただし、上記の情報はすべて非常に便利ですが、他の人にも役立つと思います。
ショーンロング

25

接続文字列で、を指定しますmax pool size=<your desired max pool size>。つまり、最大プールサイズを値500に変更する場合、接続文字列は次のようになります。

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

明らかに、私はあなたの他のパラメータについて非常に多くを仮定していますが、これはあなたにどのように進むべきか良いアイデアを与えるはずです。接続プーリングは、クライアント側のプロバイダーの実施です。接続文字列を介して、この最大プールサイズ設定を指定する必要があるのはクライアントです。

また、接続を適切に閉じているか破棄していることを確認してください。そうしないと、接続が拘束されます。このようなもの(C#):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

using(C#で)ブロックは、呼び出しIDisposable.Dispose()完了時。また、実装できるSqlConnection.Dispose()か、SqlConnection.Close()finallyのブロックのtry/catch/finallyブロック。

参照: SqlConnection.ConnectionStringプロパティに関するMSDNドキュメント


ここに接続文字列があり、私の質問も更新しています。Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
ショーンロング

3
それはどこでもあなたの接続文字列ですか?私が尋ねる理由は、異なる接続文字列は異なる接続プールになるからです。
トーマスストリンガー

それは非常に良い質問です。これまでに3つの接続文字列をチェックしましたが、それらはすべて高い最大プールを要求しています。それを引き起こす可能性のある他の文字列を見つけることができるかどうかを確認します。
ショーンロング

実行をデバッグするだけであればSqlConnection.ConnectionString、特定の操作の実行時の値を確認できるはずです。それが最も簡単な方法です。max pool size存在しない場合は、100です。
トーマスストリンガー

1
これは実際にOPに正しく回答するため、受け入れられた回答としてマークする必要があります。彼は、クライアントのconn文字列のMax Pool Sizeパラメーターと、接続を閉じる/破棄する必要性の両方に言及しています。
アダムキャビネス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.