当使用事务绑定=显式解除绑定的连接字符串时,连接将不会关闭。

5
我正在使用连接字符串中的Transaction Binding=Explicit Unbind,正如这里建议的那样,因为我同时使用了具有超时的TransactionScope。问题是,在被处理后连接似乎并没有关闭,最终连接池中就没有可用连接了。当我修改了TransactionTimeoutIssueDemo(参见链接),并使用循环足够多次地运行TransactionScopeTest()(使用显式解除绑定的连接字符串)时,我得到了相同的结果,用尽了连接池中的所有可用连接。连接池中的默认连接数为100,但可以通过使用设置Max Pool Size=10来更改。似乎即使SqlConnection和TransactionScope都使用了using语句,使用显式解除绑定时连接也不会被释放。有人知道如何处理吗?
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;
    }
}

在大多数情况下,交易将在超时内完成,一切都会很顺利。当交易实际上超时时,您需要清除池以清理无法重用的脏连接。这当然会影响池中其他未受此问题影响的连接。

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


1

值得一提的是,这个问题已经在 .Net 4.0 中得到了修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接