我们都知道datareader就像
一样datareader一次读取一条记录,但它从底层数据库驱动程序读取它。数据库驱动程序以块为单位从数据库中读取数据,通常使用8千字节的缓冲区。
如果您的结果记录很小并且您不会得到很多,那么它们都将适合缓冲区,数据库驱动程序将能够将它们全部提供给数据读取器,而无需向数据库询问更多数据。
如果你获取的结果大于缓冲区,你将只能读取它的第一部分,当网络缓冲区中不存在数据时,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()
将调用时,读者将获取一个数据块并存储在该PC中的网络缓冲区中。当datareader.read()
将调用时,单个数据将从缓冲区转发给读取器。当所有读取都将从缓冲区中读取时,将再次进行数据库调用,下一个数据块将存储在缓冲区中。
我只是想知道从db获取数据时数据读取器可以在缓冲区中存储多少数据。 数据读取器将始终从db&amp;中获取固定数量的行。存储在缓冲区中还是取决于缓冲区大小?
缓冲区大小取决于什么......它依赖于ram?
请讨论与网络缓冲区相关的事情,因为我知道数据阅读器的工作原理。感谢
答案 0 :(得分:2)
根据您的设置,您可以阅读此Default Result Set Processing and Multiple Active Result Sets和Rowsets and SQL Server Cursors
查看TcpClient.ReceiveBufferSize它会告诉您在一次操作中可以读取多少原始数据。
“ReceiveBufferSize属性获取或设置您希望在每个读取操作的接收缓冲区中存储的字节数。此属性实际操作分配用于接收传入数据的网络缓冲区空间。
您的网络缓冲区应至少与应用程序缓冲区一样大,以确保在调用NetworkStream.Read方法时可以使用所需的数据。使用ReceiveBufferSize属性设置此大小。如果您的应用程序将接收批量数据,则应将Read方法传递给一个非常大的应用程序缓冲区。
如果网络缓冲区小于您在Read方法中请求的数据量,则无法在一次读取操作中检索所需的数据量。这会导致额外调用Read方法的开销。“
此时,您将更好地了解问题答案的复杂性。