为什么这么多的sp_resetconnections用于C#连接池?

时间:2009-06-07 17:13:35

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

我们有一个用C#编码的Web服务,它可以调用MS SQL Server 2005数据库。该代码使用Using blocks与C#的连接池相结合。

在SQL跟踪期间,我们看到很多次调用“sp_resetconnection”。其中大多数是短的< 0.5秒,但有时我们会接到长达9秒的电话。

据我所知,sp_resetconnection与连接池有关,并且基本上重置了打开连接的状态。我的问题:

  • 为什么开放连接需要重置状态?
  • 为什么会有这么多电话!
  • 什么可能导致调用sp_reset连接需要花费很多时间。

这对我来说是个谜,我很感激所有的帮助!

4 个答案:

答案 0 :(得分:12)

重置只会重置事物,因此您无需重新连接来重置它们。它擦除了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输入了应用程序角色,则无法还原应用程序角色
  • 事务隔离级别(!)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

每当您从池请求新连接时,都会调用sp_resetconnection。 它必须这样做,因为池不能保证用户(你,程序员可能:) 将连接保持在适当的状态。例如使用未经通信的事务返回旧连接将是..bad。

nr个调用应与您获取新连接的nr次相关。

对于一些非常重要的电话,我不确定。可能是服务器当时正忙着处理其他东西。可能是网络延迟。

答案 3 :(得分:1)

基本上,呼叫是清除状态信息。如果你有任何打开的DataReader,它将花费更长的时间。这是因为您的DataReader只保留一行,但可以拉更多行。在重置可以继续之前,它们每个都必须被清除。因此,请确保在using()语句中包含所有内容,并且不要在某些语句中保留开放状态。

发生这种情况时,您运行的总连接数是多少?

如果你的最大值为5并且你击中全部5,那么调用重置将会阻止 - 这似乎需要很长时间。它确实不是,它只是在一个池连接上被阻止等待变得可用。

此外,如果您在SQL Express上运行,则由于线程要求非常容易被阻止(也可能在完整的SQL Server中发生,但可能性更小)。

如果关闭连接池会怎样?