数据阅读器连接状态

本文关键字:连接 状态 数据 | 更新日期: 2023-09-27 18:18:11

我使用的是c# SQL Server 2008。

在DataReader(ADO.Net)中,每次可以获取一条记录,并且连接保持打开状态,直到所有记录都被获取。

令人困惑的是,从存储过程中,我们发送了完整的表。

那么,当sql server发送所有记录时,为什么连接仍然打开?我的意思是这背后的机制是什么

数据阅读器连接状态

SQL Server不只是"发送"记录…然后客户要一个一个地读。这是一个过程并不重要。返回一个结果集,并一直读到客户端完成。

数据库将通过某种流发送结果。它的具体细节被抽象出来,所以上面一层的代码不需要关心它是网络流、命名管道还是其他什么,但它是某种流。

沿着流移动物体需要时间。从世界另一端的计算机沿着网络流移动200万行的大量记录集比从同一台计算机上的内存流移动一行记录集要花更多的时间,但无论哪种方式都需要时间。

.Next()将读取足够的字节来构建下一行数据,而不是等待所有数据被读取。可能这个数据已经在内存的缓冲区中了,因为它是从流中读取的,这可能意味着等待数据通过连接。

当你在一个巨大的记录集上调用.Next() 3次,并利用结果时,仍然可能有数据通过电线,所以你可以看到这是如何使一切尽可能高效的。此时,存储过程可能还在工作,但最有可能的是它已经完成,数据库本身也完成了查询,但是处理连接的部分仍然有一个充满结果的缓冲区要发送。

在此之后,连接仍然是打开的。它将一直打开,直到您关闭它(无论是显式地还是通过来到using块的末尾)。您可以在另一个查询中再次使用它。

在关闭SqlConnection对象之后,到数据库的实际连接可能仍然是打开的,因为池化这些连接通常比每次创建一个新连接便宜。

您必须调用数据阅读器上的close方法,如果您完成了它,我建议也处理它。我经常在关闭连接时这样做,因为我知道如果我不再需要连接,那么我就不再需要阅读器了。

例如:

 m_oleDatabaseDataReader.Close();
 m_oleDatabaseDataReader.Dispose();

DataReader不会自动关闭,您需要在DataReader对象上调用close。

//never assume always check if != null
if(m_oleDatabaseReader != null)
{  
   ((IDisposable)m_oleDatabaseReader).Dispose();
}