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

2023-12-08

我只是尝试对 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(使用前将#替换为@)

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

  • Ado.Net - 如何使用连接池?

    Net 允许连接池 根据我所读到的内容 只需向 App config 添加参数即可 问题是 我是否应该在代码中执行任何操作来使用连接池 在我的代码中 每次需要数据时我都会打开一个连接 并在完成后立即关闭它 我应该做一些特别的事情来重用连接吗
  • python 中数据库连接池的最佳解决方案是什么?

    我开发了一些类似于 DAO 的自定义类来满足我的项目的一些非常特殊的要求 该项目是一个不在任何类型的框架内运行的服务器端进程 该解决方案效果很好 只是每次发出新请求时 我都会通过 MySQLdb connect 打开一个新连接 将其切换为使
  • JDBC 连接池选项:DBCP 与 C3P0 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 适用于 Java JDBC 的最佳连接池库是什么 我正在考虑两个主要候选者 免费 开源 阿帕奇 DBC
  • CommandBehavior.SequentialAccess 是否有任何性能提升?

    我意识到我总是按照索引返回的顺序读取字段 使用常量 所以据我所知 我的代码已经与 CommandBehavior SequentialAccess 兼容 如果我打开它会有什么好处吗 DataReader 已经是只向前 只读 这才是真正的性能
  • 为什么连接没有在我的 iSeries/ASP.NET MVC 4 应用程序中重用?

    我们正在 Windows 2008 服务器场上运行 MVC 4 Web 应用程序 我们一直在尝试将服务器场升级到 Windows 2008 R2 64 位服务器 但在 iSeries 运行 V7R1 上遇到了连接池问题 我们经常调用 DB2
  • PostgreSQL JDBC4 的连接池

    最近我从以下网站下载了 PostgreSQL 的 JDBC 驱动程序here https jdbc postgresql org download html 由于我使用的是 Java 1 7 JVM 并且它是这样写的 如果您使用 1 6 或
  • 位置 0 处没有行

    cmd CommandText select from product where prod code Trim txtprod code Text and branch w location and avail stock lt gt 0
  • Tomcat 连接池与准备好的语句缓存

    从 DBCP 连接池升级到 Tomcat 自己的实现 基于优秀的比较here http tomcat apache org tomcat 7 0 doc jdbc pool html Introduction 我有点困惑为什么他们放弃了这两
  • 如何对给定列和方向的数据表进行排序?

    我需要在内存中使用基于来自 GridView 的列和方向的 DataTable 该函数需要如下所示 public static DataTable resort DataTable dt string colName string dire
  • SAP Hana DB SQL 中声明数组/表变量值时出现错误

    我试图添加一个声明的变量来替换 where in 子句中的硬编码值列表 研究 Hana 如何处理数组变量 似乎我可以通过声明一个数组 然后直接在其上使用选择或首先将其取消嵌套到表中来做到这一点 但我不断收到无法解决的错误 当我这样尝试时 D
  • 在分布式事务中手动登记后,使用 enlist=false 的连接不会关闭

    我有一个分布式事务上下文使用ServiceDomain 在其中 我打开一个 SQL 连接 其中连接字符串指定Enlist false 这样它就不是自动地被纳入交易 然后 如果我使用手动在分布式事务中登记连接EnlistDistributed
  • pg_stat_activity 中具有“空闲”状态的持久“COMMIT”查询

    如果我查询 select from pg stat activity where application name example application 我得到了很多行 哪个州是idle查询是COMMIT 它们是持久的并且不会消失 一段时
  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • 如何在 Node 中使用 Mysql2 使用 async 和 pool 获取 MySQL 的 insertId?

    我正在尝试将 async wait 与 mysql2 和池一起使用 但我认为我做错了 下面是我的代码 正如我所说 我不确定我是否在这里做事 const pool mysql createPool host localhost user ro
  • 连接池

    我有以下代码 如果我在最后使用 conn null 我仍然使用连接池吗 我知道关闭连接是一个很好的做法 但是如何处理整个连接对象呢 public void ExecuteNonQuery SqlCommand Cmd Connection
  • 如何获取数字列的确切类型,包括。规模和精度?

    有没有办法知道列中列的确切类型DataTable 现在我正在这样做 DataTable st dataReader GetSchemaTable foreach DataColumn col in st Columns var type c
  • sql查询中case语句中的布尔值

    我在选择查询中使用 case 语句 类似这样 Select col1 col2 isActive case when col3 abc then 1 else 0 end col4 from
  • SqlException超时未达到

    我们的服务器有时会抛出这个众所周知的异常 超时已过 操作完成之前超时时间已过 或者服务器未响应 当服务器处理大请求时 这种情况会在压力下发生 我做了一些研究 发现我可以改变连接字符串连接超时设置和 或SqlCommand 超时数据读取器属性
  • 如何使用Not In datatable.select

    我有一个带有 状态 列的数据表 Ado Net 此列保存值 在每个记录中 红色 绿色 蓝色 黄色 白色 其他颜色 我想选择状态值不是红色 绿色 蓝色的所有行 使用哪种过滤表达式来根据我建议的标准选择数据 所以我想实现一些像我们在 sql 查
  • SQL Server 连接池不检测关闭的连接?

    多年来 我在所有连接到 SQL 服务器的 Web 应用程序上都遇到了非常奇怪的问题 问题是 如果数据库服务器发生问题 服务器重新启动或其他问题 de web 应用程序将从那时起停止工作 即使数据库服务器处于活动状态并且之后运行良好 发生的情

随机推荐