Влияние жизненного цикла ресурса JAX-RS на производительность

Я знаю, что по умолчанию жизненный цикл конечных точек JAX-RS является разовым для каждого запроса, так что информация, специфичная для запроса, может быть введена в экземпляр.

И мы также можем создать конечную точку Singleton, означающую один раз для приложения, в которой специфическая информация запроса не может быть введена в экземпляр, а может быть введена в запрошенный метод.

1. Итак, я хотел бы знать, какой подход лучше с точки зрения производительности: один раз на запрос или один раз на приложение.

2. Я также хотел бы знать плюсы и минусы этих подходов, а также информацию о запросах на инъекцию.

3. Какой подход вы предпочитаете использовать в своих приложениях API

Примечание. До сих пор я использовал подход "один раз на запрос", но мне всегда интересно, насколько он эффективен, безусловно, он делает кодирование более простым и пригодным для повторного использования.

1 ответ

Начнем с вашего последнего вопроса: я всегда использую значение по умолчанию (для каждого запроса) и редко приходил к моменту, когда я хотел это изменить.

Что может быть причиной для предпочтения одного над другим?

  • Если вы хотите предоставить некоторый статический контент (возможно, приветственный документ вашего API), имеет смысл создать этот контент только один раз и сохранить его в классе одноэлементных ресурсов. Но вы можете достичь того же, например, путем введения @ApplicationScoped Компонент CDI в классе ресурсов для каждого запроса.
  • Если вы предпочитаете инъекцию @xxxParam такие значения, как @QueryParam в качестве полей вместо параметров метода следует использовать жизненный цикл для каждого запроса. Это не поддерживается для синглетонов. (Это не включает инъекцию через @Context).

Я сделал небольшой тест, чтобы сравнить производительность обоих. Вы можете найти источники и результаты на github. Короче говоря: я измерил разницу примерно с 1,5 %. Я не думаю, что это должно повлиять на ваше приложение слишком сильно. Сравнивая результаты мониторинга JVisualVM, я бы сказал, что при тестировании каждого запроса используется больше памяти, но вам следует самостоятельно решить, действительно ли это влияет на ваше приложение.

Другие вопросы по тегам