使用datareader时,可以在网络缓冲区中存储多少数据

我们都知道datareader就像

datareader一次读取一条记录,但它从底层数据库驱动程序读取它。 数据库驱动程序通常使用8千字节的缓冲区以块为单位从数据库中读取数据。

如果您的结果记录很小并且您没有得到很多,那么它们都将适合缓冲区,并且数据库驱动程序将能够将它们全部提供给数据读取器,而无需向数据库请求更多数据。

如果你获取的结果大于缓冲区,你将只能读取它的第一部分,当网络缓冲区中不存在数据时,datareader将通知sql server发送下一个数据块。

这里是我们使用数据阅读器的小代码

String selectString = "SELECT * FROM PRODUCT"; IList clients = new List(); using (var selectCommand = new OracleCommand(connection, selectString)) { using (OracleDataReader selectReader = selectCommand.ExecuteReader()) { if (selectReader.HasRows) { while (selectReader.Read()) { clientes.add( GetDomainObject(selectReader) ); } selectReader.close(); } } } 

假设PRODUCT表有10,000条记录。 所以我想知道一次有多少数据可以容纳在网络缓冲区中?

因为当datareader.ExecuteReader()调用时,读取器将获取一个数据块并存储在该pc的网络缓冲区中。 当datareader.read()将调用时,单个数据将从缓冲区转发到读取器。 当所有读取都将从缓冲区中读取时,将再次进行数据库调用,并将下一个数据块存储在缓冲区中。

我只是想知道从db获取数据时数据读取器可以在缓冲区中存储多少数据。 数据读取器总是从db中获取固定数量的行并存储在缓冲区中,还是取决于缓冲区大小?

缓冲区大小取决于什么……它取决于ram?

请讨论网络缓冲区相关的事情,因为我知道数据阅读器的工作原理。 谢谢

根据您的设置,读取此默认结果集处理和多个活动结果集以及行 集 和SQL Server游标

查看TcpClient.ReceiveBufferSize ,它将告诉您在一次操作中可以读取多少原始数据。

“ReceiveBufferSize属性获取或设置您希望在每个读取操作中存储在接收缓冲区中的字节数。此属性实际操作分配用于接收传入数据的网络缓冲区空间。

您的网络缓冲区应至少与应用程序缓冲区一样大,以确保在调用NetworkStream.Read方法时可以使用所需的数据。 使用ReceiveBufferSize属性设置此大小。 如果您的应用程序将接收批量数据,则应将Read方法传递给一个非常大的应用程序缓冲区。

如果网络缓冲区小于您在Read方法中请求的数据量,则无法在一次读取操作中检索所需的数据量。 这会导致额外调用Read方法的开销。“

然后阅读有关NetworkStream.Read的内容

此时,您将更好地了解问题答案的复杂性。