4

我只是尝试对 SQL Server 数据库中的表进行简单的架构更改(通过使用 SMSS 中的设计工具)。每当我尝试保存更改时,它都会超时。我想知道这是否是由于“锁定”表的现有连接。

我决定终止连接作为一个实验。我查询 master..sysprocesses 以获取该数据库的当前 spid,并一一杀死它们,直到我能够保存我的架构更改。(不是很科学,但我远非 SQL Server 专家)。果然,当我杀死了所有的 spid(除了我使用 SMSS 的那个),我能够保存架构更改。

想问一下ADO.NET SqlConnections和spids的关系。例如,如果客户端应用程序在 SqlConnection 对象上调用 Open(),我是否应该在 master..sysprocesses 中看到另一个 spid?如果我在那个 SqlConnection 上调用 Close() 会怎样?蜘蛛应该消失吗?

我敢肯定这不是那么简单,因为我知道有一个连接池的概念,但是有人可以阐明这种关系是如何工作的吗?

谢谢

大卫

4

1 回答 1

4

如果连接字符串中的 pooling=false

SqlConnection.Open()并将Close()与创建和销毁的 spid 完全相关。这导致性能非常缓慢:)

如果连接字符串中的 pooling=true

调用SqlConnection.Open()将使用池中现有的物理连接,或者如果池中没有可用的物理连接,则创建一个新连接。

创建一个新的物理连接将创建一个新的 spid,它将在sys.sysprocesses和中显示为一个新行sys.dm_exec_connections

重用现有的池化物理连接只会重用现有的 spid,因此您SqlConnection.Open()不会在服务器端的这些表中进行任何可见的更改。然而,它可以通过使用 SQL Profiler 或 XEvent 通过查找来检测sp_reset_connection,这是一个由 SqlClient 调用的存储过程,它告诉服务器清除连接状态(例如,确保没有事务等)。

SqlConnection.Close()通常会将物理连接返回到池中,因此它不会从服务器中消失。物理连接实际上在后台以各种方式关闭,例如被服务器杀死,例如kill @spidSqlConnection.ClearAllPools()

Hope that is enough detail, is there anything else you'd like to know?

于 2011-09-16T17:17:16.163 回答