2012-03-22 15 views
-1

私はASP.NET MVCアプリケーションにFoxproを移行しています。あまりにも多くの接続Asp.net

ロジックの70%近くがSqlServerストアドプロシージャに組み込まれています。そのため、いくつかのテーブルを更新するためにいくつかのプロシージャを使用しています(SPをマップしません.SqlDataReader、SqlCommand、SqlAddapterを使用してSqlConnectionを呼び出すだけです)。

問題は、各呼び出しで多くの接続が開かれることです。それでも呼び出しごとに接続が閉じられます。 sp_whoを実行すると、同じユーザーに対して複数の接続が開かれたように見えます。

各接続のクローズとディスポーザリングを実行する現在の方法は何ですか?

アクティブな接続を見つけて再利用することは可能ですか?

SqlConnection.ClearAllpools(); 

しかし、それはすぐに有効になりません。

最後の試みでした。 接続を実行するIDisposabelクラス接続があります。この方法は、各リクエストの後に呼び出され

public void close() 
{ 
    SqlConnection.ClearAllPools(); 
    //.ClearPool(BdTransCx); 
    // SqlConnection.ClearPool(BdArchCx); 

    if (ConectarArchivos) 
    { 
     if (BdArchCx.State == ConnectionState.Open) 
     { 
      BdArchCx.Close(); 
     } 
    } 
    if (BdArchCx.State == ConnectionState.Open) 
    { 
     BdTransCx.Close(); 
    } 
} 

: これはcloseメソッドを解除しています。

+1

あなたがそれを終えるとすぐに接続。 [using-statement](http://msdn.microsoft.com/en-us/library/yh598w02.aspx)を見てください。 connection-poolは、接続を閉じていないときにその接続を再利用できないと考えています。終了はプールのフラグに過ぎないことに注意してください。実際にはデータベースへの接続は開いたままにして、できるだけ早く再利用できるようにしておきます。プール内のすべての接続が使用中(開かれている)の場合、プールは非常に高価な新しい物理接続を作成します。 MaxPoolSize(デフォルトは100)に達していますが、例外が発生しています。 –

+0

非常に。あなたが話しているcloseメソッドはSqlConnection.close()ですか?またはusingでなければなりません:using-statement? –

+0

'BdArchCx'は' SqlConnection': 'BdArchCxです。try/catchのfinallyブロックのClose()は 'using(var BdArchCx = new SqlConnection(conString)){}'と似ています。これは 'using'が暗黙的に接続を閉じる' dispose'を呼び出すためです。できるだけ早く 'IDisposable'を実装するすべてのオブジェクトを処分することをお勧めします。 –

答えて

2

You should wrap your SqlConnection objects, and any SqlCommand objects in a using block

using (SqlConnection cn = new SqlConnection(connectionString)) 
{ 
    using (SqlCommand cm = new SqlCommand(commandString, cn)) 
    { 
     cn.Open(); 
     cm.ExecuteNonQuery(); 
    } 
} 

詳細については、それはまだ、データベース内のアクティブな接続をいくつか見ることが普通ですので、プールされ、.NETで"Your Friend the C# Using Statement."

+0

あなたの素早い答えのためのTks ....そのコードは接続がinmediatly置かれたことを意味するか。 –

+0

はい。 **しかし、**あなたは同じようにReaderを処理することを考慮する必要があります。 – Pankaj

2

接続を参照してください。

接続プールを強制終了しないでください。パフォーマンスが低下するだけです。プールがあるのは、が多く、毎回新しい接続を確立するよりも、接続を再利用する方が速いことです。

各接続と各コマンドを正しく閉じてプールに戻すようにしてください。あなたは起こるものは何でもそれらが正しく配置されていることを確認するusingブロックを使用することができます。

using (SqlConnection connenction = ...) { 
    using (SqlCommand command = ...) { 
    ... 
    } 
} 
1

接続の問題を避けるために、usingステートメントで同様リーダーを維持することを確認してください

閉じる
using (SqlConnection cn = new SqlConnection(connectionString)) 
{ 
    using (SqlCommand cm = new SqlCommand(commandString, cn)) 
    { 
     cn.Open(); 
     using (IDataReader dr = cm.ExecuteReader()) 
     { 
     } 
    } 
} 
+0

まだcn.Close()を呼び出す必要があります。これは、オブジェクトがガベージコレクションされるのを待つよりも高速です。 – NickG

関連する問題