5

タイムアウト付きの TransactionScope も使用しているため、ここでTransaction Binding=Explicit Unbind推奨されているように接続文字列で使用しています。問題は、接続が破棄された後に閉じられないように見え、最終的に接続プールで使用可能な接続がなくなることです。TransactionTimeoutIssueDemo (リンクを参照) を変更し、TransactionScopeTest() (明示的なアンバインド接続文字列を使用) をループで十分な回数実行して、接続プール内の使用可能なすべての接続を使い切っても、同じ結果が得られました。プール内の接続のデフォルト値は 100 ですが、これはたとえば設定を使用して変更できます。SqlConnection と TransactionScope の両方が使用されているにもかかわらず、明示的なバインド解除を使用すると、接続が解放されないようです。Max Pool Size =10using句。誰でもこれを処理する方法を知っていますか?

4

2 に答える 2

3

例のように、例外が発生した場合に備えて、接続はプールにとどまり、再利用されないように見えます。タイムアウトを増やすと、接続が再利用されます。

この問題の回避策は、次のような例外が発生した場合に備えて、接続プールをクリアすることです。

using (SqlConnection con = new SqlConnection(connectionString))
{
    con.Open();
    try
    {
        Console.WriteLine("Server is {0}", con.ServerVersion);
        Console.WriteLine("Clr is {0}", Environment.Version);
        for (int i = 0; i < 5; i++)
        {
            using (SqlCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = "insert into TXTEST values ( " + i + " )";
                cmd.ExecuteNonQuery();
            }
            Console.WriteLine("Row inserted");
        }
        Thread.Sleep(TimeSpan.FromSeconds(1));
    }
    catch
    {
        SqlConnection.ClearPool(con);
        throw;
    }
}

ほとんどの場合、トランザクションはタイムアウト内に完了し、すべてがうまくいきます。トランザクションが実際にタイムアウトになると、再利用されないダーティな接続をクリーンアップするためにプールをクリアします。これはもちろん、この問題の影響を受けないプール内の他の接続にも影響します。

これは醜い回避策ですが、うまくいくようです。

于 2008-11-24T19:10:06.237 に答える
0

価値があるのは、この問題が .Net 4.0 で修正されたことです。

于 2010-08-20T01:29:08.147 に答える