Влияние жизненного цикла ресурса JAX-RS на производительность
Я знаю, что по умолчанию жизненный цикл конечных точек JAX-RS является разовым для каждого запроса, так что информация, специфичная для запроса, может быть введена в экземпляр.
И мы также можем создать конечную точку Singleton, означающую один раз для приложения, в которой специфическая информация запроса не может быть введена в экземпляр, а может быть введена в запрошенный метод.
1. Итак, я хотел бы знать, какой подход лучше с точки зрения производительности: один раз на запрос или один раз на приложение.
2. Я также хотел бы знать плюсы и минусы этих подходов, а также информацию о запросах на инъекцию.
3. Какой подход вы предпочитаете использовать в своих приложениях API
Примечание. До сих пор я использовал подход "один раз на запрос", но мне всегда интересно, насколько он эффективен, безусловно, он делает кодирование более простым и пригодным для повторного использования.
1 ответ
Начнем с вашего последнего вопроса: я всегда использую значение по умолчанию (для каждого запроса) и редко приходил к моменту, когда я хотел это изменить.
Что может быть причиной для предпочтения одного над другим?
- Если вы хотите предоставить некоторый статический контент (возможно, приветственный документ вашего API), имеет смысл создать этот контент только один раз и сохранить его в классе одноэлементных ресурсов. Но вы можете достичь того же, например, путем введения
@ApplicationScoped
Компонент CDI в классе ресурсов для каждого запроса. - Если вы предпочитаете инъекцию
@xxxParam
такие значения, как@QueryParam
в качестве полей вместо параметров метода следует использовать жизненный цикл для каждого запроса. Это не поддерживается для синглетонов. (Это не включает инъекцию через@Context
).
Я сделал небольшой тест, чтобы сравнить производительность обоих. Вы можете найти источники и результаты на github. Короче говоря: я измерил разницу примерно с 1,5 %. Я не думаю, что это должно повлиять на ваше приложение слишком сильно. Сравнивая результаты мониторинга JVisualVM, я бы сказал, что при тестировании каждого запроса используется больше памяти, но вам следует самостоятельно решить, действительно ли это влияет на ваше приложение.