使用Transaction Binding = Explicit Unbind时,连接不会关闭;在连接字符串中

时间:2008-11-24 15:22:13

标签: c# sql-server transactions timeout connection-string

我在建议here的连接字符串中使用Transaction Binding=Explicit Unbind,因为我还使用TransactionScope和超时。问题是连接在处理后似乎没有关闭,最终连接池中没有可用的连接。当我修改TransactionTimeoutIssueDemo(请参阅链接)并在循环中运行TransactionScopeTest()(使用显式的unbind连接字符串)足够多次以使用连接池中的所有可用连接时,我得到了相同的结果。池中连接的默认值为100,但可以使用例如Max Pool Size =10设置更改此值。即使SqlConnection和TransactionScope都与using子句一起使用,似乎在使用显式解绑时也不会释放连接。任何人都知道如何处理这个?

2 个答案:

答案 0 :(得分: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;
    }
}

在大多数情况下,交易将在超时内完成,一切都会很好,花花公子。当事务实际执行超时时,清除池以清除不会被重用的脏连接。这当然会影响池中不受此问题影响的其他连接。

这是一个丑陋的解决方法,但似乎有效。

答案 1 :(得分:0)

对于它的价值,这个问题已在.Net 4.0中修复。