.net - 如果仍然存在对池化 SQL 连接的引用,它们是否会被清除?

标签 .net sql-server connection-pooling sqlconnection

@usr我是 having a disagreement in another question关于 .NET 是否会清除已空闲但仍保留引用的打开连接。

我认为,based on documentation ,如果物理连接空闲一段时间,即使仍然持有 SQLConnection 对象引用,它也会在一段时间后被回收。

usr 声称这种情况不会发生,它只会回收不再有引用的连接。他的断言是,这将使连接池变得不可靠,并对事务造成严重破坏。

我承认,文档对于保留引用的问题含糊其辞。

我正在寻找对此的权威答案,而不仅仅是猜测。要么有人已经实验并证明了这两种情况,要么有人了解内部工作原理。

那么到底是哪一个呢?

编辑:

我认为这里的困惑在于“关闭”的术语。情况似乎是,文档将关闭物理连接称为从池中“删除”连接。而“关闭”是指将打开的物理连接释放回池中以供重复使用。

打开的连接仍然可以被中止,但不清楚如果客户端应用程序仍将其保持为打开状态(即客户端应用程序尚未对中止的连接调用关闭),则池化器是否将其标记为无效,但不确定这是否真的很重要,而不是作为池计数的一部分。

最佳答案

我可以 100% 肯定地告诉您,连接在释放之前不会返回到池中。我有一个 session 创建一个临时表,并在等待用户输入时将其挂起。用户在 6 分钟后返回,按下按钮,它会在同一个 SPID 上继续,并在临时表上继续工作。

应用逻辑,这是有道理的,因为您能想象如果仅仅因为您闲置了 X 分钟而丢失 SPID 会造成多大的破坏吗?您是否应该继续使用命令“ping”SQL Server 来使其保持事件状态? (这会很疯狂)


您似乎混淆了两个概念。当连接关闭时,它会返回到池中。如果超出范围,则隐式关闭 -> 返回到池中。对“空闲”的引用是指池中的连接何时空闲,而不是当它被主动引用且未关闭时。保留的连接甚至不在池中,无法进行任何类型的清理。从池中释放资源是有意义的,因为网络应用程序可以轻松爆发到 100 个连接,然后在接下来的几个月内保持在 20 个左右的事件并发连接。

关于.net - 如果仍然存在对池化 SQL 连接的引用,它们是否会被清除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12664317/

相关文章:

sql - 根据其他几列的条件对不同的一列进行计数

java - 准备好的语句以及连接池

cloud - 云原生环境中的连接池

c# - 如何检测我网站上的辱骂性评论?

c# - AES 256 加密与结果不匹配

c# - 如何用最小起订量 stub 抽象集合?

sql-server - SQL Server SSIS 和 Oracle 数据泵

sql-server - Varchar 的最大大小(max)

azure - 连接到 Azure 缓存服务大约需要 3.3 秒

c# - 访问 Microsoft.SqlServer.Management.Smo.Server 对象的成员正好崩溃一次