【问题标题】:ADO.net: Why is the connection pool not using the already opened connection?ADO.net:为什么连接池没有使用已经打开的连接?
【发布时间】:2018-01-31 14:23:01
【问题描述】:

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

但是当我对 SQL Server 2005 执行此代码时,第二个 open() 将事务转换为分布式事务。从这一刻起,我在服务器上看到了 2 个连接。第二个 open() 大约需要 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();
}

【问题讨论】:

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


    【解决方案1】:

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

    当后端服务器支持可推广事务时,它允许 LTM不这样做,而是使用可以推广到 DTC 的 LTM 事务作为并在需要时。在大多数情况下,在单个 TransactionScope 中不跨越多个不同资源的情况下,这将是“从不”。

    这意味着结合TransactionScope 的SQL Server 2005 必须做更多的工作,导致这种结果。

    由于 SQL Server 2005 的生命周期结束(“扩展支持”结束)是 2016 年 4 月 12 日 - 今天这真的不应该伤害任何人。 SQL Server 2008 R2 有效期至 2019 年 7 月 9 日。

    【讨论】:

    • 嗨,马克,感谢您的回答。我阅读了有关 LTM 和交易促进的信息。如果我理解正确,您的回答解释了为什么事务会因为打开第二个连接而被提升。但是为什么要打开第二个连接呢?为什么不使用第一个连接?谢谢!
    • @vlopel 我所拥有的一切都是“因为原因”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多