Быстрая загрузка первой страницы данных по HTTP - PullRequest
4 голосов
/ 18 августа 2010

Довольно нормальный сценарий:

  • У меня есть отчет с большим количеством строк (> 2000), который будет представлен в виде таблицы HTML.
  • Я отправляю результаты на стороне клиента (браузера).
  • Я хочу сделать первую страницу как можно быстрее, остальные будут продолжать загружаться в формате JSON (всего около 1 МБ)

Я хочу использовать один запрос к серверу, потому что запрос к базе данных является дорогостоящим (и я не хочу ничего кэшировать на веб-сервере) ... поэтому я думаю об использовании Comet или сбросе только первой страницы данные, а затем сбросить больше тегов сценария для остальных данных.

Это возможно? Есть ли уроки / примеры этого?

Спасибо.

Ответы [ 8 ]

2 голосов
/ 20 августа 2010

вполне выполнимо;однако я сделал бы это двумя вызовами.

На протоколе более низкого уровня было бы легко выполнить сброс, но я вспомнил кое-что забавное о сбросе json.

2 голосов
/ 26 августа 2010

Измените интерфейс на стороне сервера, чтобы принимать от и до параметров, чтобы вы могли контролировать, сколько будет получено. Создайте / измените spoc в SQL для эффективной подкачки страниц на стороне SQL (часть подкачки будет выглядеть как Row_number () OVER (order by MyColumn)). Это фактически сделает первый запрос намного быстрее сквозного (SQL будет отправлять менее 5% данных, скажем, 100 строк). Затем во втором запросе вы можете получить все остальное или разделить его на 2 или более частей (SQL-сервер также лучше отправляет негигантские блоки - эффективная подкачка - сравнительно новая функция, например, 5-летняя)

1 голос
/ 26 августа 2010

Похоже, что новый поиск картинок, который предоставляет Google, делает это почти точно! Он загрузит ссылки на 1000 изображений, закодированных в скрипте внизу страницы, и выполнит страницу / прокрутку на стороне клиента. Работает в Firefox, мой IE получает старую версию страницы. Проверьте это по адресу: http://www.google.com/images

1 голос
/ 24 августа 2010

Подход flush / comet к описанному должен работать.

Вы также можете сделать это, сделав один вызов из базы данных, но 2 HTTP-вызова.При начальной загрузке страницы получите ResultSet и сохраните его в Application.Cache или Session.Выведите первую «страницу» результатов в браузер.Когда браузер завершит получение первой страницы, сделайте AJAX-вызов WebService (или используйте UpdatePanel / Timer с одной отметкой), который получит оставшиеся записи из Application.Cache / Session, за вычетом уже извлеченных строк,Наконец, очистите Application.Cache / Session.

1 голос
/ 24 августа 2010

Разделите свою первую страницу на две части,

  1. UI
  2. Веб-сервис

Пользовательский интерфейс будет загружаться мгновенно, а после загрузки пользовательский интерфейс может инициировать вызов веб-службы, который может загружать данные в диапазонах. Библиотека ASP.NET AJAX может использоваться для загрузки веб-службы с того же сервера.

1 голос
/ 24 августа 2010

Таблица HTML, с моей точки зрения, представляет собой процесс блокировки.Браузер не начнет рендеринг до последнего тега

</table> 

.

Что вы можете сделать, это использовать AJAX, чтобы сначала асинхронно извлекать данные в скрытый div, а затем, когда данные будут закончены, просто добавьте тег закрытия таблицы и сделайте div видимым.Изменить 1:

Я настоятельно рекомендую вам взглянуть на следующую ссылку , вы сможете адаптировать этот пример для своих нужд.

В этом примере Iизменит следующую строку:

  xmlHttp.open("GET","GetWeather.aspx?City=" + city,true);    

на ваш собственный URL и строку запроса.Затем измените следующую строку:

if(xmlHttp.readyState==4)
   {       
       //show contents of the response using responseText property of xmlHttp obj
       document.getElementById('dvWeather').innerHTML = xmlHttp.responseText;
    } 

Так, чтобы вы добавили существующий элемент HIDDEN, а затем сделали этот элемент видимым (например, используйте Jquery)

0 голосов
/ 26 августа 2010

Вы можете использовать веб-сокет ... запросить первые 100 или около того набора результатов, отобразить таблицу, а затем отправить второе сообщение, чтобы собрать оставшиеся данные, которые будут сохранены в массиве JSON. Включает только один вызов БД.

0 голосов
/ 20 августа 2010

Использование Comet на самом деле будет использовать два соединения (одно для получения первой страницы и одно для загрузки остальных), но вы могли бы, как вы говорите, очистить вывод после первой страницы, а затем продолжать сбрасывать каждый раз через некоторое время, пока весь ваш документ не будет загружен. Вы также можете использовать кодировку GZIP, которая сделает загрузку немного быстрее, хотя это увеличит накладные расходы сервера и клиента, и я не уверен, что вы можете использовать для этого сброс данных.

...