代码之家  ›  专栏  ›  技术社区  ›  David

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

  •  3
  • David  · 技术社区  · 14 年前

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

    我决定作为一个实验来终止联系。我查询master..sysprocesses以获取该数据库的当前SPID,并逐个杀死它们,直到能够保存我的模式更改。(不是很科学,但我远不是SQL Server的专家)。当然,当我杀死所有的SPID(除了使用SMSS的SPID)时,我能够保存模式更改。

    我想问一下ADO.NET SQLConnections和SPID之间的关系。例如,如果客户机应用程序在sqlconnection对象上调用open(),我应该在master..sysprocesses中看到另一个spid吗?如果我在那个sqlconnection上调用close()呢?SPID应该消失吗?

    我相信这并不是那么简单,因为我知道有一个连接池的概念,但是有人能解释一下这种关系是如何工作的吗?

    谢谢你

    戴维

    1 回复  |  直到 13 年前
        1
  •  1
  •   Jared Moore    13 年前

    如果连接字符串中pooling=false

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

    如果连接字符串中pooling=true

    打电话 sqlconnection.open()打开 将使用来自池的现有物理连接,或者如果池中没有可用的物理连接,则创建一个新的物理连接。

    创建新的物理连接将创建新的SPID,该SPID将显示为 sys.sysprocesses sys.dm_exec_connections .

    重用现有的池物理连接只会重用现有的SPID,因此 sqlconnection.open()打开 不会在服务器端的那些表中进行任何可见的更改。但是,可以使用SQL事件探查器或XEvent通过查找 sp_reset_connection ,这是一个由sqlclient调用的存储过程,它告诉服务器清除连接状态(例如,确保没有事务等)。

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

    希望这足够详细,你还有什么想知道的吗?