0

SQL 例外をキャッチし、再スローしていません。これは、期待どおりに接続がプールに返されないことを意味しているようです。これは可能ですか?

        using (IDbCommand paymentCommand = this.Connection.CreateCommand())
        {
            try
            {
                //database stuff
            }
            catch (SqlException ex)
            {
               //LOG CALL
            }
        }
4

3 に答える 3

0

質問では、接続をどのように作成しているかは明確ではありませんが、エラーの有無に関係なく、必ず開いてから閉じる必要があります。

通常、私は次のようなことをします。

SqlConnection connection = null;
try {
    connection.Open();

    // Do stuff like run a query, setup your IDbCommand, etc.
} catch (Exception ex) {
    // Log error
} finally {
    if (connection != null) {
        connection.Close();
    }
}

このように、何が起こっても、接続は閉じられ、プールに戻されます。Close()に失敗すると、その接続が「リーク」し、最終的にはプールされた接続が不足して描画されます。接続の存続期間は、通常、SQLコマンドを発行するのにかかる時間だけである必要があり、その時点で接続を閉じる必要があります。

于 2012-04-27T14:56:37.687 に答える
0

接続プールで何を経験しているのかは明確ではありません。しかし、私は間違いなくあなたのつながりをusing声明で包みます。

これは私が通常使用するものです(これはdac.GetConnection()、接続オブジェクトを取得するためにコードを一元化する単なるクラスであることに注意してください)。

using (SqlConnection connection = dac.GetConnection())
{
  using (SqlCommand command = new SqlCommand("myProc", connection))
  {
    command.CommandType = CommandType.StoredProcedure;
    try
    {
      connection.Open();           
      //add params, run query

    }
    catch (Exception ex)
    {
      //handle/log errror
    }
    finally
    {
      if (connection.State == ConnectionState.Open)
        connection.Close();
    }
  }
}
于 2012-04-27T15:25:03.080 に答える
0

try{} ブロック内に using(...){} を入れてみませんか? このように、例外がスローされた場合でも、block を使用すると IDBcmd obj が破棄されます。

于 2012-04-27T12:52:09.097 に答える