Обновление страницы без обратной передачи за наименьшее время независимо от размера БД - PullRequest
0 голосов
/ 22 октября 2009

Какой метод очень эффективен и прост для написания кода для достижения этой функциональности?

Обновление страницы без обратной передачи за наименьшее время независимо от размера БД.

Считайте, что у меня в таблице 10 миллионов записей, мне нужно извлечь 1000 записей из конкретного пользователя и отобразить его на странице. Он / она может получить еще несколько записей в следующих 2 секунд. Затем я должен снова нажать на БД, чтобы получить эти 2 записи и предупредить их. новое сообщение. какой метод будет хорош для достижения этого?

  1. MS AJAX
  2. Базовый XML HttpRequest и методология ответа
  3. Webservice
  4. WCF
  5. Любой другой ??

Пожалуйста, дайте мне знать, с точной причиной, почему вы выбираете этот вариант, вы предложить и, если возможно, с простым примером кода.

Заранее спасибо.

Ответы [ 6 ]

2 голосов
/ 31 октября 2009

Наиболее важным аспектом проблемы будет то, как вы выполняете запрос, чтобы найти новые записи для пользователя. Вам нужно только отозвать записи, которые вы еще не получили ранее на странице. Этого можно достичь, сохранив переменную на клиенте, отслеживая хронологически последнюю запись, полученную ранее. Затем только запросите у сервера записи пользователя, которые попадают после этой точки. Для этого вашим записям потребуется метка времени, или их первичные ключи должны будут гарантированно падать после более ранних записей при сортировке.

// jQuery example
$.getJSON(
    "http://domain/url?after=" + lastTimeStamp,
    function(data) {
        // Render the data
    }
)

Убедившись, что количество записей, полученных по вашему запросу, является минимальным, требуемым клиентом, вы также хотите убедиться, что запрос выполняется быстро. Вероятно, помогло бы убедиться, что вышеупомянутый столбец отметки времени и столбец внешнего ключа для связи записи с пользователем проиндексированы. Кроме того, если вы используете хранимую процедуру, то тот факт, что механизм БД имеет кэшированный план выполнения, должен значительно ускорить возврат запроса.

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

Если скорость является единственным фактором, не имеет большого значения, какую серверную технологию вы используете для размещения кода, который отправляет записи клиенту. Важно то, что вы отправляете только необработанные данные. Другими словами, я бы рекомендовал не использовать панель обновления ASP.NET. Вместо этого я бы создал веб-сервис, возможно, в WCF, который кодирует объекты в виде структур данных JSON, чтобы уменьшить размер ответа и время, необходимое для его анализа. Затем я заставил клиента запустить код Javascript для генерации HTML. DOM-манипуляции, даже с использованием таких инструментов, как JQuery, довольно быстрые.

1 голос
/ 22 октября 2009
  1. Поместите GridView, содержащий пользовательские записи, внутри UpdatePanel
  2. Добавление элемента управления Timer на страницу
  3. Установите событие Tick Timer для использования в качестве триггера AsyncPostBack для UpdatePanel

Вот образец (не тестировался):

<asp:Timer ID="myTimer" runat="server" Interval="2000" OnTick="Timer_Tick" />                

<asp:UpdatePanel runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:GridView ID="myGrid" runat="server">
        </asp:GridView>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="myTimer" EventName="Tick" />
    </Triggers>
</asp:UpdatePanel>  

и в обратном вызове сервера перепривязать сетку:

private void Timer_Tick(object sender, EventArgs args)
{
    myGrid.DataSource = FetchUserRecordsFromDb();
    myGrid.DataBind();
}
0 голосов
/ 31 октября 2009

Джейкоб дал вам очень хорошее предложение.

В качестве альтернативы, вы можете попробовать совершенно другой подход: загрузить страницу, затем получить данные после загрузки страницы, используя jQuery, чтобы получить результат JSON или предварительно отформатировать результат на стороне сервера HTML и просто записать его прямо в ожидание. Элемент HTML.

$(document).ready(loadListDataFromHtml);

function loadListDataFromHtml(){
$.ajax({
type: "GET",
   url: "http://appname/listItems",
   data: "groupId=27",
   success: function(htmlResultString){
     $("targetDivSelector").html(htmlResultString);
   }
 });
}


function loadListDataFromJSON(){
$.ajax({
   type: "GET",
   url: "http://appname/listItems",
   data: "groupId=27",
   success: function(data){
    var jsonResult = eval(data);
    var resultHtml = "";

    //loop through records in jsonResult building html client side

    $("targetDivSelector").html(resultHtml);
   }
 });
}
0 голосов
/ 25 октября 2009

.live метод впервые введен в jQuery 1.3.2. Он регистрирует событие нажатия даже после обратной передачи. Иначе вам нужно каждый раз вызывать метод live для $ (document) .ready из javascript, например:

$(document).ready(function()   {
$("#btnTest").click(function()
{
   // do your operation
}});
0 голосов
/ 23 октября 2009
 $("#btnTest").live("click", function(){
$.ajax({
    type: "POST",
    url: "jQueryAjax.aspx/StaticMethodName",
    data: "{val : 'parametervalue'}",
    contentType: "application/json; charset=utf-8;",
    dataType: "json",
    success: function(msg)
    {
        alert('DB Updated : '+msg);
    },
    failure:function(response)
    {
        alert('Error : '+response);
    }
});   

});

Итак, когда щелкается btnTest, он запускает метод StaticMethodName, который написан в коде c # позади. Вы можете ответить сообщением.

0 голосов
/ 22 октября 2009

Вы можете перейти на jQuery Ajax и вызвать статический метод, который будет быстрее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...