ADO.net:为什么连接池没有使用已经打开的连接?

时间:2018-01-31 14:23:01

标签: c# sql-server transactions ado.net connection-pooling

此代码的预期行为是一个连接被打开。然后连接返回到连接池并在第二个open()上重用。正确?

但是当我对 SQL Server 2005 执行此代码时,第二个open()会将事务转换为分布式事务。我从这一刻开始看到服务器上的2个连接。而第二个打开()大约需要3-4秒。从这一点开始,只使用了第二个。第一个连接似乎以某种方式被诅咒。

使用 SQL Server 2008 R2 时,只会使用一个连接,如预期的那样。

有什么想法吗?谢谢!

using (var scope = new System.Transactions.TransactionScope())
{

    var constring = @"Server=xxx;Integrated Security=true;Connect Timeout=10;";

    using (var con = new SqlConnection(constring))
    {
        con.Open();
    }

    using (var con = new SqlConnection(constring))
    {
        con.Open();
    }

    scope.Complete();
}

1 个答案:

答案 0 :(得分:6)

"轻量级交易管理器" (LTM)对SQL Server 2005没有支持 - 它不支持此类可促销事务,因此为了保证TransactionScope所需的保证,它必须使用完整的"分布式事务协调器" (DTC)交易 - 如果存在环境交易(TransactionScope),它必须立即执行。

当后端服务器支持可促销事务时,它允许LTM 不执行此操作,而是使用可以提升到DTC 的LTM事务并在需要时。这将是"永远"在大多数情况下,不会在一个TransactionScope中跨越多个不同的资源。

这意味着SQL Server 2005与TransactionScope结合使用必须做更多工作,从而产生这种结果。

对于SQL Server 2005的生命周期结束(#34;扩展支持"结束)是2016年4月12日 - 今天真的不应该伤害任何人。 SQL Server 2008 R2将持续到2019年7月9日。