客户端应用程序中打开的 SqlConnections 与 SQL Server 中的进程之间有什么关系?

Dav*_*vid 4 ado.net connection-pooling sqlconnection spid

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

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

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

我确信事情没有那么简单,因为我知道存在连接池的概念,但是有人可以阐明这种关系是如何运作的吗?

谢谢

大卫

Jar*_*ore 5

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

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

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

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

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

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

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

希望已经足够详细了,您还有什么想知道的吗?