我只是尝试对SQL Server数据库中的表进行简单的架构更改(通过使用SMSS中的设计工具)。每当我试图保存更改时,它都会保持超时。我想知道这是否是由于现有的连接“锁定”了这个表。
我决定将连接作为一个实验来杀死。我查询master..sysprocesses以获取该数据库的当前spid,并逐个杀死它们,直到我能够保存我的架构更改。 (不是很科学,但我远不是SQL Server的专家)。果然,当我杀死了所有的spid(就像我使用SMSS那样)时,我能够保存模式更改。
我想问一下ADO.NET SqlConnections和spids之间的关系。例如,如果客户端应用程序在SqlConnection对象上调用Open(),我应该在master..sysprocesses中看到另一个spid吗?如果我在SqlConnection上调用Close()怎么办? spid应该消失吗?
我确信它不是那么简单,因为我知道有一种连接池的概念,但有人可以阐明这种关系是如何运作的吗?
谢谢
大卫
答案 0 :(得分:1)
如果连接字符串中的pooling = false
SqlConnection.Open()
和Close()
将与创建和销毁的spid完全相关。这导致非常缓慢的表现:)
如果连接字符串中的pooling = true
调用SqlConnection.Open()
将使用池中的现有物理连接,或者如果池中没有可用的连接,则创建一个新的物理连接。
创建新的物理连接会创建一个新的spid,它将显示为sys.sysprocesses
和sys.dm_exec_connections
中的新行。
重用现有的池化物理连接只会重用现有的spid,因此SqlConnection.Open()
不会对服务器端的那些表进行任何可见的更改。但是,可以通过查找sp_reset_connection
使用SQL事件探查器或XEvent来检测它,这是一个由SqlClient调用的存储过程,它告诉服务器清除连接状态(例如,确保没有事务等)。 / p>
SqlConnection.Close()
通常会返回到池的物理连接,因此它不会从服务器中消失。物理连接实际上是以各种方式关闭的,例如被服务器杀死,例如kill @spid
和SqlConnection.ClearAllPools()
。
希望这是足够的细节,还有什么你想知道的吗?