我只是尝试对 SQL Server 数据库中的表进行简单的架构更改(通过使用 SMSS 中的设计工具)。每当我尝试保存更改时,它总是超时。我想知道这是否是由于现有的连接“锁定”了表。
作为一个实验,我决定终止连接。我查询 master..sysprocesses 以获取该数据库的当前 spid,并一一杀死它们,直到我能够保存我的架构更改。 (不是很科学,但我远不是 SQL Server 专家)。果然,当我杀死所有 spid(除了我使用 SMSS 的那个)后,我能够保存架构更改。
我想问一下ADO.NET SqlConnections和spids之间的关系。例如,如果客户端应用程序在 SqlConnection 对象上调用 Open(),我是否应该在 master..sysprocesses 中看到另一个 spid?如果我在该 SqlConnection 上调用 Close() 会怎么样? spid 应该消失吗?
我确信事情没有那么简单,因为我知道存在连接池的概念,但是有人可以阐明这种关系是如何运作的吗?
谢谢
David
如果连接字符串中的 pooling=false
SqlConnection.Open()
and Close()
将与 spid 的创建和销毁完全相关。这会导致性能非常慢:)
如果连接字符串中的 pooling=true
Calling SqlConnection.Open()
将使用池中现有的物理连接,或者如果池中没有可用的物理连接,则创建一个新的。
创建新的物理连接将创建一个新的 spid,它将显示为新行sys.sysprocesses
and sys.dm_exec_connections
.
重用现有的池化物理连接只会重用现有的 spid,因此您SqlConnection.Open()
不会对服务器端的这些表进行任何可见的更改。但是,可以使用 SQL Profiler 或 XEvent 通过查找来检测sp_reset_connection
,这是一个由 SqlClient 调用的存储过程,它告诉服务器清除连接状态(例如,确保没有事务等)。
SqlConnection.Close()
通常会将物理连接返回到池中,因此它不会从服务器中消失。物理连接实际上在幕后以各种方式关闭,例如被服务器终止,例如kill @spid
and SqlConnection.ClearAllPools()
.
希望已经足够详细了,您还有什么想知道的吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)