Асинхронно извлекайте данные из хранилища данных и рисуйте карту - PullRequest
2 голосов
/ 23 августа 2010

У меня есть приложение Spring MVC 3 (которое использует JSP), работающее в Google App Engine и сохраняющее информацию в хранилище данных. Я использую Google Maps API v3 для проецирования некоторых данных на карты путем рисования фигур, раскраски и т. Д. В моей базе данных потенциально могут храниться миллионы записей.

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

Стоит ли использовать GWT?

Любой совет был бы великолепен.

Спасибо!

1 Ответ

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

Вы можете использовать курсор, похожий на метод нумерации страниц, описанный здесь:

Разбивка на страницы в Google App Engine с Java

Когда ваша страница с картой загружается, сделайте запрос AJAX с пустым параметром курсора. Обработчик запроса извлекает небольшое количество объектов, а затем возвращает ответ, содержащий их и курсор (если остаются объекты).

Из клиентского javascript, после отображения элементов на карте, если в ответе есть курсор, запустите новый запрос с курсором в качестве аргумента. В обработчике запроса, если указан курсор, используйте его при выполнении запроса.

Это создаст непрерывный цикл запросов AJAX, пока все элементы не будут выбраны и отображены на карте.

Обновление:

Вы можете написать сервис, который возвращает JSON, примерно так:

{
    items: 
    [
        { lat: 1.23, lon: 3.45, abc = 'def' },
        { lat: 2.34, lon: 4.56, abc = 'ghi' }
    ],
    cursor: '1234abcd'
}

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

Затем на стороне клиента я бы рекомендовал использовать функцию jQuery ajax для выполнения вызовов ajax, что-то вроде этого:

$(document).ready(function()
{
    // first you may need to initialise the map - then start fetching items
    fetchItems(null);
});

function fetchItems(cursor)
{
    // build the url to request the items - include the cursor as an argument
    // if one is specified
    var url = "/path/getitems";
    if (cursor != null)
        url += "?cursor=" + cursor;

    // start the ajax request
    $.ajax({
        url: url,
        dataType: 'json',
        success: function(response)
        {
            // now handle the response - first loop over the items
            for (i in response.items)
            {
                var item = response.items[i];
                // add something to the map using item.lat, item.lon, etc
            }

            // if there is a cursor in the response then there are more items,
            // so start fetching them
            if (response.cursor != null)
                fetchItems(response.cursor);
        }});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...