gpt4 book ai didi

c# - 使用datareader时网络缓冲区可以存储多少数据

转载 作者:行者123 更新时间:2023-11-30 17:00:15 25 4
gpt4 key购买 nike

据我们所知,datareader 的工作方式如下

数据读取器一次读取一条记录,但它是从底层数据库驱动程序中读取的。数据库驱动程序以 block 的形式从数据库中读取数据,通常使用 8 KB 的缓冲区。

如果你的结果记录很小而且你得到的不是很多,它们将全部放入缓冲区,数据库驱动程序将能够将它们全部提供给数据读取器而无需向数据库请求更多数据.

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

这是我们如何使用数据读取器的小代码

String selectString = "SELECT * FROM PRODUCT";  
IList<client> clients = new List<client>();
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() 调用时,读取器将获取数据 block 并存储在该 pc 的网络缓冲区中。当 datareader.read() 调用时,单个数据将从缓冲区转发到读取器。当所有读取将从缓冲区中读取时,将再次进行数据库调用,并将下一个数据 block 存储在缓冲区中。

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

缓冲区大小取决于什么....是否取决于内存?

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

最佳答案

根据您的设置阅读此 Default Result Set Processing and Multiple Active Result SetsRowsets and SQL Server Cursors

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

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

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

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

然后阅读 NetworkStream.Read

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

关于c# - 使用datareader时网络缓冲区可以存储多少数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22554158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com