Как мне создать веб-сервис с единым доступом? - PullRequest
1 голос
/ 31 января 2011

У меня есть веб-сервис Jax-RS Jersey на Weblogic.Он работает нормально, но возвращает большое количество данных.Проблема в том, что если у меня одновременно более 4 вызовов службы, я использую всю память JVM на сервере, то все перестает работать, и мне приходится перезагружаться.

Как я могу ограничить службузапустить только 2 или 3 экземпляра и ждать других звонков?

Ответы [ 2 ]

0 голосов
/ 31 января 2011

Если вы терпите крах JVM только с тремя или четырьмя запросами, то я, вероятно, начну смотреть на архитектуру того, что сделано.Как упоминал Qwerky, вы создаете все возвращаемые объекты?Эти объекты тяжелые?Не могли бы вы использовать более легкие объекты для возврата данных?Вы должны вернуть все данные сразу?Сколько (количество записей / объект) данных вы потенциально можете вернуть?Насколько большой (размер в КБ, МБ и т. Д.)?На сервере достаточно памяти?Установлены ли минимальные и максимальные значения памяти сервера при запуске в значения, которые помогают ему работать лучше?Есть утечка?Я слишком быстро создаю слишком много объектов в куче?

И в ожидании, что это не что-то с приложением само по себе, а как насчет кластеризации и балансировки нагрузки (для распределения запросов).

Кроме того ... в зависимости от количества данных, которые вы возвращаете ... иногда веб-сервис не является хорошей вещью.В моей компании был случай, когда мы пытались разработать веб-сервис, который должен был обрабатывать отсылку около 30 тыс. Строк данных.Это было слишком много, чтобы справиться с этим.Мы фактически превратили этот процесс в пакетный процесс.Результаты этого процесса были использованы нашим веб-интерфейсом и веб-сервисами.Поскольку пользователям все равно не понадобились данные до следующего дня, это просто упростило управление обработкой данных.

Просто некоторые разные мысли, которые помогут вам по-другому взглянуть на это.

0 голосов
/ 31 января 2011

Как вы возвращаете свои данные?Вы создаете весь объект для возврата в память?Если это так, то вы можете вместо этого взглянуть на потоковую передачу ответа.

Можете ли вы дать нам представление о том, что делает ваш сервис?

Редактировать:
Вы можете передавать материал (как данные из ResultSet), как это;

@GET
public MyResultStream getData()
{
  ResultSet rs = queryDatabase();
  return new MyResultStream(rs);
}

Вам нужно будет предоставить MyResultStream самостоятельно;

public class MyResultStream implements javax.ws.rs.core.StreamingOutput
{
  private ResultSet rs;

  public MyResultStream (ResultSet rs)
  {
    this.rs = rs;
  }

  public void write(OutputStream output)
  {
    //write any document pre-able
    // for example <results>

    while (rs.next())
    {
      //get the data from the ResultSet and write it to the output in XML form
      // for example <result><foo>bar</foo></result>
    }

    //write any document post-amble
    // for example </results>
  }
}

Помните, что вам придется как-то закрыть свой ResultSet.

...