【问题标题】:Why so many sp_resetconnections for C# connection pooling?为什么有这么多用于 C# 连接池的 sp_resetconnections?
【发布时间】:2010-11-01 00:44:56
【问题描述】:

我们有一个用 C# 编码的 Web 服务,它对 MS SQL Server 2005 数据库进行多次调用。该代码使用 Using 块结合 C# 的连接池。

在 SQL 跟踪期间,我们看到很多很多对“sp_resetconnection”的调用。其中大多数都很短

从我读到的 sp_resetconnection 与连接池有关,基本上重置了打开连接的状态。我的问题:

  • 为什么打开的连接需要重置其状态?
  • 为什么会有这么多电话!
  • 可能导致调用 sp_reset 连接花费大量时间的原因。

这对我来说是个谜,我感谢任何帮助!

【问题讨论】:

  • 如果您的分析器跟踪显示 sp_reset_connetion 需要很长时间,您为什么不查看该客户端在调用之前所做的工作?这应该让您了解通话期间正在拆除的状态。

标签: c# sql-server-2005 connection-pooling sp-reset-connection


【解决方案1】:

重置只是重置事物,因此您不必重新连接来重置它们。它会清除 SET 或 USE 操作之类的连接,因此每个查询都有一个干净的状态。

连接仍在被重用。这是extensive list:

sp_reset_connection 重置连接的以下方面:

  • 它重置所有错误状态和数字(如@@error)
  • 它会停止作为父 EC 的子线程执行并行查询的所有 EC(执行上下文)
  • 它将等待任何未完成的 I/O 操作
  • 它将释放连接在服务器上的所有缓冲区
  • 它将解锁连接使用的所有缓冲区资源
  • 它将释放连接所拥有的所有分配的内存
  • 它将清除连接创建的所有工作表或临时表
  • 它将杀死连接拥有的所有全局游标
  • 它将关闭所有打开的 SQL-XML 句柄
  • 它将删除所有打开的 SQL-XML 相关工作表
  • 它将关闭所有系统表
  • 它将关闭所有用户表
  • 它将丢弃所有临时对象
  • 它将中止打开的事务
  • 它会在入伍时脱离分布式事务
  • 它会减少当前数据库中用户的引用计数;释放共享数据库锁
  • 它将释放获得的锁
  • 它将释放可能已获取的所有句柄
  • 它将所有 SET 选项重置为默认值
  • 它将重置@@rowcount 值
  • 它将重置@@identity 值
  • 它将使用 dbcc traceon() 重置任何会话级别的跟踪选项

sp_reset_connection 不会重置:

  • 安全上下文,这就是连接池根据确切的连接字符串匹配连接的原因
  • 如果您使用 sp_setapprole 输入了应用程序角色,因为应用程序角色无法恢复
  • 事务隔离级别(!)

【讨论】:

    【解决方案2】:

    这是对What does sp_reset_connection do? 的解释,其中部分内容是“数据访问 API 的层,如 ODBC、OLE-DB 和 SqlClient,在重新使用来自连接池的连接时调用(内部)存储过程 sp_reset_connection。它执行此操作在重新使用之前重置连接的状态。”然后它给出了系统存储过程的一些细节。这是一件好事。

    【讨论】:

      【解决方案3】:

      每次您从池中请求新连接时,都会调用 sp_resetconnection。 它必须这样做,因为池不能保证用户(你,程序员可能:) 已使连接处于正确状态。例如返回带有未提交事务的旧连接将是..bad。

      调用次数应与您获取新连接的次数有关。

      至于有些通话需要很长时间,我不确定。可能是服务器当时正忙于处理其他内容。可能是网络延迟。

      【讨论】:

        【解决方案4】:

        基本上,调用是清除状态信息。如果您有任何打开的 DataReader,则需要更长的时间才能发生。这是因为您的 DataReaders 只保存一行,但可以拉更多行。在重置可以继续之前,它们每个都必须被清除。因此,请确保您在 using() 语句中拥有所有内容,并且不会在某些语句中留下任何内容。

        发生这种情况时,您总共运行了多少连接?

        如果您的最大值为 5,并且您击中了所有 5,则调用重置将阻塞 - 并且看起来需要很长时间。确实不是,它只是在等待池连接可用时被阻塞。

        此外,如果您在 SQL Express 上运行,您很容易因为线程要求而被阻塞(在完整的 SQL Server 中也可能发生,但可能性要小得多)。

        如果关闭连接池会发生什么?

        【讨论】:

          猜你喜欢
          • 2017-11-30
          • 2016-04-26
          • 2021-05-29
          • 1970-01-01
          • 2016-05-19
          • 1970-01-01
          • 2012-10-26
          • 1970-01-01
          相关资源
          最近更新 更多