2

ASP.NET Webforms 4アプリケーションでのコードビットに問題があります。 SQL Server 2008 R2、IIS 7を使用しています。このWebサイトはWindows Server 2008 R2上で別のアプリケーションプール(統合モード、.NET4、32ビットアセンブリのサポート)で動作しています。ASP.NETアプリケーションが開かれているWAYが多すぎます

次のコードは、問題を装っている:

Dim sqlCmd = New SqlClient.SqlCommand 
With sqlCmd 
    Using sqlConnectionToUse As SqlClient.SqlConnection = GetActiveConnexion(pstrConnectString), _ 
     vAdaptor As New SqlClient.SqlDataAdapter 

      .Connection = sqlConnectionToUse 

      .CommandText = pstrSQL 'function parameter 

      vAdaptor.SelectCommand = sqlCmd 
      'query1: SELECT somecolumn FROM table WHERE somecolumn '' ==> opens a new connection in SQL Server 
      'query2: SELECT someothercolumn FROM anothertable WHERE someothercolumn 23 ==> uses my WebSite process active connection 
      vAdaptor.Fill(vDataSet) 
    End Using 
End With 

UPDATE:私はQUERY2を実行すると、すべて、

Return New SqlClient.SqlConnection("my connection string obtained from the web.config file") 

をGetActiveConnexion()メソッドは、単に私の場合は、次のコードを実行しASP.NETアプリケーションは、アプリケーションプールのopenned接続を使用して、結果をデータセットに取得します。

しかし、私はquery1を実行するたびに、新しい接続がSQLサーバーで開かれています(SSMSのアクティビティモニターに表示されているのがわかります)。問題は、このクエリ1を100回実行すると、接続プールの上限に達し、非常に悪いことが起こることです。私はまだデータセット内の結果を取得し、それらを使用することができます。 新しい接続はvAdaptator.Fill()の呼び出しで作成されます。

何が問題なの?

ありがとうございます。 (PS:悪い英語のために申し訳ありません)ここで

は好む人のためのC#のコードです:それは使い捨てだとして

object sqlCmd = new SqlClient.SqlCommand(); 
using (SqlClient.SqlConnection sqlConnectionToUse = GetActiveConnexion(pstrConnectString)) { 
    using (SqlClient.SqlDataAdapter vAdaptor = new SqlClient.SqlDataAdapter()) { 

     sqlCmd.Connection = sqlConnectionToUse; 

     sqlCmd.CommandText = pstrSQL; //function parameter 

     vAdaptor.SelectCommand = sqlCmd; 
     //query1: SELECT F10_ID FROM FIN_MONTANT_TT_F10 WHERE F10_ID_TT_F19 = '' ==> opens a new connection in SQL Server 
     //query2: SELECT A48_ID FROM ADH_EPARTICIPANT_ADMIN_A48 WHERE A48_ID=23 ==> uses my WebSite process active connection 
     vAdaptor.Fill(vDataSet); 
    } 
} 
+0

常に同じ接続文字列のですか?私が 'GetActiveConnexion()'のロジックを見る必要があると思います - 明示的に開いている/開いているかどうかを確認する必要があると思っていますか? –

+0

私は 'GetActiveConnexion使用する接続を閉じますか? – Widor

+0

接続プーリングは、まったく同じ接続文字列によって異なります。 pstrConnectString変数をquery1の点でチェックしましたか? query1を実行したときの正確なpstrConnectStringは何ですか? –

答えて

1

あなたSqlCommandインスタンスを使用してブロック内にラップする必要があります。これはおそらくあなたの問題の原因です。

using (SqlClient.SqlConnection sqlConnectionToUse = GetActiveConnexion(pstrConnectString)) 
{ 
    using (SqlCommand sqlCmd = sqlConnectionToUse.CreateCommand()) 
    { 
     using (SqlClient.SqlDataAdapter vAdaptor = new SqlClient.SqlDataAdapter()) 
     { 
      ... 
     } 
    } 
} 

やVB

Using sqlConnectionToUse As SqlClient.SqlConnection = GetActiveConnexion(pstrConnectString) 
    Using sqlCmd As SqlCommand = sqlConnectionToUse.CreateCommand() 
     Using vAdaptor As New SqlClient.SqlDataAdapter() 
       ... 
     End Using 
    End Using 
End Using 
+0

ちょっと追加しました。私の問題ではコードの方が効果的です。 EDIT:私の使用は同じ順序ではありませんでしたが、もう一度試してみましょう。多分sqlConnectionToUse.CreateCommand()が役に立ちます。 – CharlesAD

+0

上記のコードは問題を引き起こしてはいけません。接続プーリングの結果として接続が表示されているだけではありませんか? SqlCommandを破棄した後でもそれは成長しますか? – TheCodeKing

+0

本当に役に立ちます。しかし、私はまだ約15の接続です。私はこのコードブロックの周りにsynclockを使用しています(これはコードスニペットに追加するのを忘れていました)。これはまだコードを実行するためにいくつかのスレッドが待機しているため、接続を開いたままにしておくことができますか? Usingsはsyncklockの内側にあります(ロックがとられると接続が開かれるべきではありません)。 – CharlesAD

関連する問題