gpt4 book ai didi

c# - ADO.net:为什么连接池不使用已经打开的连接?

转载 作者:行者123 更新时间:2023-11-30 14:22:41 25 4
gpt4 key购买 nike

此代码的预期行为是打开一个连接。然后将连接返回到连接池中,并在第二次 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();
}

最佳答案

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

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

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

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

关于c# - ADO.net:为什么连接池不使用已经打开的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48544447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com