Сколько данных может храниться в сетевом буфере при использовании datareader

все мы знаем, что datareader работает как

Средство чтения данных считывает запись за раз, но считывает ее из базового драйвера базы данных. Драйвер базы данных считывает данные из базы данных блоками, обычно используя буфер размером 8 килобайт.

Если ваши записи результатов малы и их не очень много, все они поместятся в буфере, и драйвер базы данных сможет передать их все в устройство чтения данных, не запрашивая у базы данных дополнительные данные.

Если вы получите результат, который больше, чем буфер, вы сможете прочитать только первую его часть, и когда в сетевом буфере не будет данных, программа чтения данных сообщит серверу sql об отправке следующего блока данных.

вот небольшой код, как мы используем считыватель данных

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() вызовет, тогда отдельные данные будут отправлены на считыватель из буфера. когда все прочитанные будут прочитаны из буфера, вызов базы данных будет выполнен снова, и следующий блок данных будет сохранен в буфере.

Мне просто любопытно узнать, сколько данных устройство чтения данных может хранить в буфере при извлечении данных из базы данных. считыватель данных всегда будет извлекать фиксированное количество строк из базы данных и хранить в буфере, или это зависит от размера буфера?

размер буфера зависит от чего....это зависит от оперативной памяти?

пожалуйста, обсуждайте только вещи, связанные с сетевым буфером, потому что я знаю, как работает считыватель данных. Благодарность


person Thomas    schedule 21.03.2014    source источник
comment
сетевая буферизация вряд ли будет узким местом....   -  person Mitch Wheat    schedule 21.03.2014
comment
И размер буфера не зависит от доступной оперативной памяти. Это просто удобное значение для предотвращения крайней неэффективности операций (т. е. отправки данных по одному байту за раз). Хватит гадать, тестируйте и профилируйте. Если вы хотите увидеть, какими пакетами обмениваются клиент и сервер, используйте Wireshark или другой анализатор пакетов. Если вы считаете, что это может быть узким местом в производительности, перестаньте верить и протестируйте его.   -  person Luaan    schedule 21.03.2014


Ответы (1)


В зависимости от вашей настройки прочитайте этот раздел Обработка набора результатов по умолчанию и нескольких активных наборов результатов и наборы строк и курсоры SQL Server

Посмотрите TcpClient. .ReceiveBufferSize сообщит вам, сколько необработанных данных можно прочитать за одну операцию.

«Свойство ReceiveBufferSize получает или задает количество байтов, которое вы ожидаете сохранить в приемном буфере для каждой операции чтения. Это свойство фактически манипулирует пространством сетевого буфера, выделенным для приема входящих данных.

Ваш сетевой буфер должен быть не меньше буфера вашего приложения, чтобы гарантировать, что нужные данные будут доступны при вызове метода NetworkStream.Read. Используйте свойство ReceiveBufferSize, чтобы задать этот размер. Если ваше приложение будет получать объемные данные, вы должны передать методу Read очень большой буфер приложения.

Если сетевой буфер меньше объема данных, который вы запрашиваете в методе Read, вы не сможете получить желаемый объем данных за одну операцию чтения. Это влечет за собой накладные расходы на дополнительные вызовы метода Read».

а затем прочитайте о NetworkStream.Read

В этот момент у вас будет лучшее представление о сложности ответа на ваш вопрос.

person Paul Zahra    schedule 21.03.2014
comment
до сих пор не ясно, когда я извлекаю 100 или более записей с помощью средства чтения данных, сколько данных может быть размещено или сохранено в сетевом буфере сразу после одной поездки в базу данных. - person Thomas; 21.03.2014
comment
TcpClient.ReceiveBufferSize даст мне необработанный размер и, исходя из необработанного размера, как я могу понять, сколько записей может храниться в сетевом буфере. - person Thomas; 21.03.2014
comment
Конечно, это экстраполяция размера записи / размера данных записи / накладных расходов TCP. Согласно Microsoft размер ReceiveBufferSize по умолчанию составляет 2 ^ 13, или 8192, или 8 КБ. - person Paul Zahra; 21.03.2014