1

私はMSSQL2008R2を使用しています。C#アプリを作成しましたが、意図的にSqlConnectionを閉じませんでした。 VS2010でローカルにデバッグします。使用したコードは次のとおりです。

protected void Button1_Click(object sender, EventArgs e)
    {
        string connectionString = "server=s; database=db; User ID=sa; Password=p; Max Pool Size=1;Connect Timeout=3";
        SqlConnection conn = new SqlConnection(connectionString);
        string query = "SELECT * FROM dbo.Numbers";
        SqlCommand comm = new SqlCommand(query, conn);
        conn.Open();
        SqlDataReader reader = comm.ExecuteReader();
        //reader.Read() and display results to Textbox1.Text
    }

最大プールサイズ=1; 2番目のブラウザで2回目のクリックを試してエラーが発生することを期待していました。3つの異なるブラウザ(Mozilla、Chrome、IE)にアクセスして、それぞれ1回クリックメソッドを呼び出すことができるのはなぜですか。これは、3つの同時接続に相当しますか?タイムアウトエラーは、ブラウザを使用している場合にのみ発生しますが、そのブラウザでメソッドを2回呼び出します。どうしてこれなの?

4

2 に答える 2

0

接続オブジェクトを開いたままにしたからといって、3つの別々の接続を意味するわけではありません。.NET Frameworkは、実際にはSQL Serverの接続プールを活用し、接続文字列によって管理します。接続文字列は3つのリクエストすべてで同じであり、接続が利用可能であったため、競合は発生しません。

さて、長時間実行されているクエリがリクエストの1つで起動し、それをもう一度ヒットする状況をシミュレートすると、おそらく最初に待機し、タイムアウト例外が発生します。

これは、MSDNの.NETFrameworkでの接続プールに関する長くて乾燥したドキュメントです。

于 2013-02-25T16:06:27.797 に答える
0

したがって、VS2010とIIS7.5でローカルにデバッグすることの間には矛盾があるように見えます。最大プールサイズが期待どおりに動作するように、サンプルWebサイトをIISに展開する必要がありました。どのブラウザを試しても、クリックイベントをもう一度呼び出そうとすると、タイムアウトエラーがスローされます。これは予想されることです。再テストするには、必要に応じてWebサイト/アプリプールの再起動/リサイクルを実行します。

何らかの理由で、VS 2010でローカルにデバッグすると、最大プールサイズの制限がバイパスされます。各ブラウザはクリックイベントを呼び出すことがあり、私の例では3つのsqlconnectionオブジェクトを開きます。タイムアウトエラーがスローされるのは、ブラウザにとどまり、クリックメソッドを2回呼び出した場合のみです。奇妙な振る舞いですが、開発者が知っておくべきことです。

于 2013-02-25T19:52:41.163 に答える