2010-11-25 14 views
0

ADO.NET接続プールに関連する運用環境で例外が増えている原因を突き止めようとしていますが、ログには多くの例外がありますADO.NET接続プールで使用できる接続がありません

タイムアウトが切れています。プールから 接続を取得する前に、タイムアウト期間 が経過しました。プールされたすべての 接続が使用され、最大プール サイズに達したため、 が発生している可能性があります。

私が試した最初のことは、すべての接続が閉じられ、廃棄されていることを確認することでした。私は次の接続文字列使用してい

try 
{ 
    oConnection.Open(); 
    //do something 
}  
catch() 
{ 

} 
finally 
{ 
    if (oConnection.State != ConnectionState.Closed) 
    { 
     oConnection.Close(); 
     oConnection.Dispose(); 
    } 
} 

:我々は、すべてのデータベース接続を変更することを行うためのSQLServerのための

Performance Managerで
server=databaseserver;Database=databasename;User Id=username;Password=password;Max Pool Size=600;Min Pool Size=50;Connection Timeout=180;Pooling=true 

、.NETデータ・プロバイダを、私がいることがわかります」 NumberOfPooledConnections "と" NumberOfActivePooledConnections "は接続文字列の最大プールサイズよりも常に小さく、常に60〜90の接続です。

どのようにそれを可能にすることができますか?プールに接続がないという例外がありますが、プールが満杯ではないことがわかります。

私の環境:(すべての最近のpatchs付き)

  • のWindows Server 2003のEnterprise SP2
  • (Webガーデンに4つのワーカープロセスとし、アプリケーションプールは60分ごとにリサイクル)IIS 6.0を
  • SQL Serverの2005

誰でもお手伝いしますか?

答えて

5
using (oConnection) { 

    oConnection.Open(); 

    // Your code here 

    // No need to explicitly close or dispose 

} 
+0

こんにちはMahesh Velaga、私はあなたの要点を持っていますが、センサが接続文字列の最大プールサイズより少ない接続を表示していることは間違いありませんか? – user520488

+0

@ user520488 @bitxwiseの回答を見て、私はまた、それらのいくつか(接続)が休眠していると考えている(しかし、実際には処分されていない)と思います。 –

0

状態が閉鎖されるかもしれないが、あなたが本当に前に示唆したように使用してブロックを使用し、接続を配置していないので、接続がまだ配置されていません。

1

コード

if (oConnection.State != ConnectionState.Closed) 
{ 
    oConnection.Close(); 
    oConnection.Dispose(); 
} 

のこの部分)は(閉じられた接続を配置しないであろう。それが問題だとは思っていませんが、修正する必要があります。 Jusrは無条件のDispose()またはusing() { }ブロックを使用します。

0

最初に、SQL Serverが許可する最大接続の設定は、.NET接続プールの最大許容接続のADO.NET設定とは異なります。

第2に、SqlConnection.Close()を呼び出すとSQL Serverへの接続が実際に終了しません。これは単に接続プールに、接続をもう少し開いたままにする必要がないことを伝えます。ただし、接続プールは、同じ接続文字列を持つ別の接続要求が要求された場合に、少し長く開いたままにします。これを確認するには、接続を閉じる前と後にSQL Serverのアクティビティモニタを確認してください。 SQL Server上の接続の状態が実際に眠っていることがわかります。

タイムアウトの例外として、using() { }ブロックを使用する皆様の提案に同意します。さらに、SqlDataReaderを使用している場合は、それも閉じていることを確認してください。