[英]Why so many sp_resetconnections for C# connection pooling?
我们有一个用C#编码的Web服务,可以调用MS SQL Server 2005数据库。 代码使用Using块结合C#的连接池。
在SQL跟踪期间,我们看到许多调用“sp_resetconnection”。 其中大部分时间短<0.5秒,但有时我们的呼叫持续时间长达9秒。
从我读到的内容来看,sp_resetconnection与连接池有关,并且基本上重置了打开连接的状态。 我的问题:
这对我来说是个谜,我很感激所有的帮助!
重置只是重置事物,因此您不必重新连接以重置它们。 它擦除了SET或USE操作之类的连接,因此每个查询都有一个干净的平板。
该连接仍在重用。 这是一个广泛的列表 :
sp_reset_connection重置连接的以下方面:
sp_reset_connection不会重置:
这是对sp_reset_connection做什么的解释? 其中部分说“数据访问API的层,如ODBC,OLE-DB和SqlClient在重新使用连接池中的连接时调用(内部)存储过程sp_reset_connection。这样做是为了在连接之前重置连接状态再利用“。 然后它给出了系统sproc所做的一些细节。 那是一件好事。
每次从池请求新连接时都会调用sp_resetconnection。 它必须这样做,因为池不能保证用户(您,程序员可能:)已将连接保持在适当的状态。 例如,返回与未通信事务的旧连接将是..bad。
nr个调用应该与您获取新连接的次数相关。
对于一些非常微不足道的电话,我不确定。 可能是服务器当时正忙着处理其他东西。 可能是网络延迟。
基本上,呼叫是清除状态信息。 如果你有任何打开的DataReader,它将花费更长的时间。 这是因为您的DataReader只保留一行,但可以拉更多行。 在重置可以继续之前,它们每个都必须被清除。 因此,请确保在using()语句中包含所有内容,并且不要在某些语句中保留开放状态。
发生这种情况时,您运行的总连接数是多少?
如果你有一个最大值5并且你击中全部5,那么调用重置将会阻止 - 这似乎需要很长时间。 它确实不是,它只是被阻止等待池化连接变得可用。
此外,如果您在SQL Express上运行,则由于线程要求非常容易被阻止(也可能在完整的SQL Server中发生,但可能性更小)。
如果关闭连接池会发生什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.