Отображение строк, извлеченных из базы данных, одна за другой в DataGrid - PullRequest
0 голосов
/ 29 октября 2009

У меня есть таблица (сеанс) в базе данных, которая имеет почти 72 000 строк. Я извлекаю эти строки с помощью php + mysql, но когда результат возвращается в HTTPService, мне нужно подождать около 32 секунд, прежде чем все строки начнут появляться в DataGrid сразу.

Вопрос Есть ли способ, с помощью которого DataGrid может начать отображать данные один за другим, в то время как приложение может извлекать следующие строки параллельно. Или что DataGrid может отображать данные сотнями. Например, когда приложение запускается, оно может показывать первые 400 записей в DataGrid, затем следующие 400 сотен извлекаются, пока не будут извлечены все 72 000 строк?

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

Большое спасибо, ребята, как всегда.

<mx:HTTPService id="populateTable" url="request.php" method="POST"  resultFormat="e4x">
     <mx:request xmlns="">
        <getResult>table</getResult>
     </mx:request>
</mx:HTTPService>

код из файла PHP

function populateTable()
{
   $Result = mysql_query("SELECT * FROM session" );

   $Return = "<Sessions>";
   while ( $row = mysql_fetch_object( $Result ) )
   {
     $Return .= "<session><no>".$no."</no>" . 
                "<srcIP>".$row->srcIP."</srcIP>" .
               "<dstIP>".$row->dstIP."</dstIP>" .
                "<sPort>".$row->sPort."</sPort>" .
                "<dPort>".$row->dPort."</dPort>" .
                "<sessionID>".$row->sessionID."</sessionID>" .
                "<numberOfConnections>".$row->numberOfConnections."</numberOfConnections>" .
                "</session>";
   }
     $Return .= "</Sessions>";
  // mysql_free_result( $Result );

   echo $Return;
}

1 Ответ

1 голос
/ 29 октября 2009

Подумайте о редизайне приложения. Ни один здравомыслящий пользователь не должен видеть все 72 КБ данных одновременно.

  • Измените скрипт php, чтобы он принимал параметр startIndex и выбирал 100 строк из этого индекса вместо выбора *.
  • Кнопки добавления следующей страницы / предыдущей страницы в приложении flex, которые вызывают повторную отправку HTTPService с измененным значением startIndex. Свяжите lastResult из HTTPService с DataGrids dataProvider.

Обновление:

<mx:HTTPService id="service" resultFormat="e4x"/>
<mx:DataGrid dataProvider="{service.lastResult}">
  <!-- columns -->
</mx:DataGrid>
<mx:Button label="Next" click="next()"/>
<mx:Button label="Prev" click="prev()"/>
<mx:Script>
  <![CDATA[
    private var currentIndex:Number = 0;
    private var itemsPerPage:Number = 100;
    private var total:Number = 72000;
    private function next():void
    {
      if(currentIndex + 1 >= total/itemsPerPage)
        return;
      currentIndex++;
      service.url = "request.php?page=" + currentIndex;
      service.send();
    }
    private function prev():void
    {
      if(currentIndex == 0)
        return;
      currentIndex--;
      service.url = "request.php?page" + currentIndex;
      service.send();
    }
  ]]>
</mx:Script>

Здесь я добавил индекс к самому URL. Вы также можете использовать request свойство HTTPService для отправки данных.

В php измените запрос "SELECT * FROM session", чтобы он выбирал только 100 запросов на основе значения $_GET["page"].

...