试图通过发出“sp_reset_connection”来理解 Sql Profiler 的含义。
我有以下“exec sp_reset_connection”行,后跟 BatchStarting 和 Completed,
RPC:Completed exec sp_reset_connection SQL:BatchStarting SELECT [c].[TestID] AS [TestID], [c].[Description] AS [Description] FROM [dbo].[Test] AS [c] SQL:BatchCompleted SELECT [c].[TestID] AS [TestID], [c].[Description] AS [Description] FROM [dbo].[Test] AS [c]
基本上第一行“exec sp_reset_connection”是否意味着整个过程(我的连接被打开,select stmt运行,然后连接被关闭并释放回池)才发生?或者我的连接仍处于开放阶段。
而且,为什么 sp_reset_connection 在我自己的 select 语句之前执行,它不应该在用户的 sql 之后进行重置吗?
我想知道有没有办法更详细地了解连接何时打开和关闭?
通过看到“exec sp_reset_connection”,这是否意味着我的连接已关闭?
就像其他答案所说,sp_reset_connection表明连接池正在被重用。注意一个特殊的后果!
sp_reset_connection
Jimmy Mays 的 MSDN 博客 说: sp_reset_connection 不会将事务隔离级别从先前连接的设置重置为服务器默认值。
Jimmy Mays 的 MSDN 博客 说:
sp_reset_connection 不会将事务隔离级别从先前连接的设置重置为服务器默认值。
更新 :从 SQL 2014 开始,对于 TDS 版本 7.3 或更高版本的客户端驱动程序,事务隔离级别将重置为默认值。
以下是一些附加信息:
sp_reset_connection 有什么作用? 数据访问 API 的层(如 ODBC、OLE-DB 和 System.Data.SqlClient)在重新使用连接池中的连接时都调用(内部)存储过程 sp_reset_connection。它这样做是为了在重新使用之前重置连接的状态,但是没有记录什么东西会被重置。本文尝试记录被重置的连接部分。 sp_reset_connection 重置连接的以下方面: 所有错误状态和数字(如@@error) 停止作为执行并行查询的父 EC 的子线程的所有 EC(执行上下文) 等待任何未完成的 I/O 操作 通过连接释放服务器上所有持有的缓冲区 解锁连接使用的任何缓冲区资源 释放连接拥有的所有已分配内存 清除连接创建的任何工作表或临时表 杀死连接拥有的所有全局游标 关闭所有打开的 SQL-XML 句柄 删除任何打开的 SQL-XML 相关工作表 关闭所有系统表 关闭所有用户表 删除所有临时对象 中止未结交易 入伍时分布式事务的缺陷 减少当前数据库中释放共享数据库锁的用户的引用计数 释放获得的锁 释放任何获取的句柄 将所有 SET 选项重置为默认值 重置@@rowcount 值 重置@@identity 值 使用 dbcc traceon() 重置任何会话级别的跟踪选项 NULL在 SQL Server 2005 和更新版本中将CONTEXT_INFO 重置为[不是原始文章的一部分] sp_reset_connection 不会重置: 安全上下文,这就是连接池根据确切的连接字符串匹配连接的原因 使用sp_setapprole输入的应用程序角色,因为在 SQL Server 2005 之前根本无法恢复应用程序角色。从 SQL Server 2005 开始,可以恢复应用程序角色,但只能使用不属于会话的附加信息。在关闭连接之前,需要通过sp_unsetapprole使用sp_setapprole执行时捕获的“cookie”值手动恢复应用程序角色。
sp_reset_connection 有什么作用?
数据访问 API 的层(如 ODBC、OLE-DB 和 System.Data.SqlClient)在重新使用连接池中的连接时都调用(内部)存储过程 sp_reset_connection。它这样做是为了在重新使用之前重置连接的状态,但是没有记录什么东西会被重置。本文尝试记录被重置的连接部分。
sp_reset_connection 重置连接的以下方面:
所有错误状态和数字(如@@error)
停止作为执行并行查询的父 EC 的子线程的所有 EC(执行上下文)
等待任何未完成的 I/O 操作
通过连接释放服务器上所有持有的缓冲区
解锁连接使用的任何缓冲区资源
释放连接拥有的所有已分配内存
清除连接创建的任何工作表或临时表
杀死连接拥有的所有全局游标
关闭所有打开的 SQL-XML 句柄
删除任何打开的 SQL-XML 相关工作表
关闭所有系统表
关闭所有用户表
删除所有临时对象
中止未结交易
入伍时分布式事务的缺陷
减少当前数据库中释放共享数据库锁的用户的引用计数
释放获得的锁
释放任何获取的句柄
将所有 SET 选项重置为默认值
重置@@rowcount 值
重置@@identity 值
使用 dbcc traceon() 重置任何会话级别的跟踪选项
NULL在 SQL Server 2005 和更新版本中将CONTEXT_INFO 重置为[不是原始文章的一部分]
NULL
sp_reset_connection 不会重置:
安全上下文,这就是连接池根据确切的连接字符串匹配连接的原因
使用sp_setapprole输入的应用程序角色,因为在 SQL Server 2005 之前根本无法恢复应用程序角色。从 SQL Server 2005 开始,可以恢复应用程序角色,但只能使用不属于会话的附加信息。在关闭连接之前,需要通过sp_unsetapprole使用sp_setapprole执行时捕获的“cookie”值手动恢复应用程序角色。
sp_setapprole
注意:我在此处包含列表,因为我不希望它在瞬息万变的网络中丢失。