#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 и серверного анализа):
-
Используйте RequestBuilder для получения данных с сервера. Пример использования:http://www.gwtapps.com/doc/html/com.google.gwt.http.client.html
-
Затем используйте 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 напрямую создает объекты.
Обновить:
основываясь на комментариях, я бы рекомендовал это:
-
Проанализируйте XML-файл с помощью JAXB, чтобы создать свои объекты: http://jaxb.java.net/guide/_XmlRootElement_and_unmarshalling.html
-
Сохраните их в memcache:http://code.google.com/appengine/docs/java/memcache/overview.html
-
При запросе 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. Вы правы. Я рассматриваю возможность отправки только отфильтрованного списка объектов вместо отправки всего, но недостатком может быть большее количество запросов клиент-сервер. Но да, я, безусловно, рассматриваю этот вариант. Спасибо.