【发布时间】:2014-03-21 08:55:09
【问题描述】:
我们都知道 datareader 的工作原理是这样的
数据读取器一次读取一条记录,但它从底层数据库驱动程序中读取它。数据库驱动程序以块的形式从数据库中读取数据,通常使用 8 KB 的缓冲区。
如果您的结果记录很小并且您没有得到很多,它们将全部放入缓冲区中,并且数据库驱动程序将能够将它们全部提供给数据读取器,而无需向数据库询问更多数据.
如果您获取的结果大于缓冲区,您将只能读取它的第一部分,当网络缓冲区中不存在数据时,datareader 将通知 sql server 发送下一个数据块。
这是我们如何使用数据阅读器的小代码
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() 调用时,读取器将获取一个数据块并存储在该电脑的网络缓冲区中。当datareader.read() 调用时,单个数据将从缓冲区转发到读取器。当所有读取都将从缓冲区读取时,将再次调用数据库并将下一个数据块存储在缓冲区中。
我只是想知道从 db 获取数据时数据读取器可以在缓冲区中存储多少数据。 数据读取器将始终从 db 中获取固定数量的行并存储在缓冲区中,还是取决于缓冲区大小?
缓冲区大小取决于什么......它取决于内存吗?
请仅讨论与网络缓冲区相关的内容,因为我知道数据读取器的工作原理。谢谢
【问题讨论】:
-
网络缓冲不太可能成为瓶颈......
-
而且缓冲区大小不取决于可用的 RAM。这只是一个方便的值,可以防止操作效率极低(即一次发送一个字节的数据)。停止猜测、测试和分析。如果您想查看客户端和服务器之间正在交换哪些数据包,请使用 Wireshark 或其他数据包嗅探器。如果您认为这可能是性能瓶颈,请停止相信并对其进行测试。
标签: c# datareader