Где хранить данные для приложения GWT — хранилище данных GAE или XML-файл

#java #xml #google-app-engine #gwt #google-cloud-datastore

#java #xml #google-app-engine #gwt #google-облачное хранилище данных

Вопрос:

У меня есть приложение GWT, которое развернуто на GAE. Одна часть моего приложения полагается на статические данные, которые в настоящее время хранятся в XML-файле. Приложение считывает эти данные в коллекцию POJO. Данные передаются клиенту с использованием GWT-RPC. Основываясь на выборках, сделанных пользователем, он применяет фильтры к коллекции для получения определенных объектов (фильтрация выполняется на стороне клиента).

Данные могут содержать до 3000 записей, а общий размер XML-файла будет составлять около 1 МБ. Со стороны приложения эти данные обновляться не будут (они доступны только для чтения), но я могу часто добавлять новые записи или обновлять / исправлять существующие записи в течение первых нескольких месяцев (по мере развития приложения). Данные не связаны ни с какими другими данными в приложении.

Одно из моих главных соображений в отношении производительности выборки. Я попытался использовать Apache Digester для анализа XML, но заметил, что даже анализ 600 записей и отправка их клиенту были немного медленными.

Учитывая эти требования, что из следующего было бы лучше и почему — 1. Сохранить данные в файле XML или 2. Сохранить данные в хранилище данных app engine?

Спасибо.

Комментарии:

1. То есть вы всегда отправляете клиенту весь файл целиком?

Ответ №1:

Одной из альтернатив было бы загрузить XML-файл непосредственно с помощью GWT (без GWT-RPC и серверного анализа):

  1. Используйте RequestBuilder для получения данных с сервера. Пример использования:http://www.gwtapps.com/doc/html/com.google.gwt.http.client.html

  2. Затем используйте XMLParser для анализа ответа. Пример:http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsXML.html#parsing

Вот пример, объединяющий оба:http://www.roseindia.net/tutorials/gwt/retrieving-xml-data.shtml

Единственным недостатком является то, что вам приходится вручную анализировать XML через DOM, где GWT-RPC напрямую создает объекты.

Обновить:

основываясь на комментариях, я бы рекомендовал это:

  1. Проанализируйте XML-файл с помощью JAXB, чтобы создать свои объекты: http://jaxb.java.net/guide/_XmlRootElement_and_unmarshalling.html

  2. Сохраните их в memcache:http://code.google.com/appengine/docs/java/memcache/overview.html

  3. При запросе RPC проверьте memcache, если данных там нет, переход 1.

Комментарии:

1. @Peter — спасибо за ваш ответ. Возможно, вы поняли, что этот вопрос был продолжением одного из моих предыдущих вопросов, на который вы ответили. Проблема с RequestBuilder заключается в том, что он предоставляет весь XML (я могу легко просмотреть файл с помощью Firebug). Я хочу сохранить XML защищенным от пользователя и предоставлять его только через приложение. Если я отправляю коллекцию POJO с сервера, это не предоставляет пользователям весь XML-файл целиком. Учитывая это дополнительное ограничение, какой вариант был бы наилучшим? Еще раз спасибо.

2. На самом деле я не связал два вопроса. Вы все еще можете использовать GWT-RPC, но отправлять XML в виде одной большой строки.

3. В AppEngine вы можете использовать JAXB для сопоставления XML с вашими классами, а затем сохранить эти классы (массив или записи?) в memcache.

4. @Peter — Я попробовал ваше первое предложение и отправил XML-файл в виде строки с помощью GWT-RPC, но я все еще могу в значительной степени прочитать содержимое файла полностью с помощью Firebug. Единственное отличие в том, что я вижу n и t в выходных данных. Мне нужно больше узнать о JAXB и memcache, прежде чем я смогу попробовать ваше второе предложение. Я сделаю это и опубликую обновление. Спасибо.

5. @Peter — Мне удалось заменить Apache Digester на JAXB, и производительность улучшилась. Итак, я хорош в том, что касается синтаксического анализа XML. Теперь перейдем к memcache, допустим, я добавляю новые записи в свой XML-файл каждую неделю. Как мне убедиться, что объект в memcache обновляется каждый раз, когда обновляется XML? Спасибо за всю вашу помощь.

Ответ №2:

С моей точки зрения, есть два бутылочных горлышка, хотя и взаимосвязанных. Одним из них является загрузка данных (чтение из XML, синтаксический анализ). Другой отправляет его клиенту. Вместо отправки всего пакета вы могли бы рассмотреть пакетную отправку, например, разбивку на страницы.

Обычно я предпочитаю хранить такие файлы в WEB-INF.

Комментарии:

1. Вы правы. Я рассматриваю возможность отправки только отфильтрованного списка объектов вместо отправки всего, но недостатком может быть большее количество запросов клиент-сервер. Но да, я, безусловно, рассматриваю этот вариант. Спасибо.