5

我在此处Transaction Binding=Explicit Unbind推荐的连接字符串中使用,因为我也在使用带有超时的 TransactionScope。问题是连接似乎在被处理后并没有关闭,最终连接池中没有更多可用的连接。当我修改 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 回答