【问题标题】:JAX-RS Resource Lifecycle Performance ImpactJAX-RS 资源生命周期性能影响
【发布时间】:2015-05-23 06:57:39
【问题描述】:

我知道默认情况下 JAX-RS 端点生命周期是once-per-request,因此可以将请求特定信息注入到实例中。

我们还可以创建一个端点单例,意思是每个应用程序一次,其中请求的特定信息不能注入到实例中,而是可以注入到请求的方法中。

1.所以我想知道哪种方法在性能方面更好每个请求一次每个应用程序一次

2.我也想知道这些方法除了注入请求特定信息的优缺点

3.您更喜欢在 API 应用程序中使用哪种方法

注意:到目前为止,我一直在使用每次请求一次的方法,但我一直想知道这是否有效,绝对是它使编码更容易和可重用。

【问题讨论】:

    标签: java jersey jax-rs resteasy


    【解决方案1】:

    从您的最后一个问题开始:我一直在使用默认值(按请求),而且我很少想到要更改它。

    偏爱其中一个的原因可能是什么?

    • 如果您想提供一些静态内容(可能是您的 API 的欢迎文档),那么只生成一次该内容并将其保存在单例资源类中是有意义的。但是您可以通过例如在每个请求范围的资源类中注入 @ApplicationScoped CDI bean。
    • 如果您更喜欢将 @xxxParam 值(如 @QueryParam)作为字段而不是方法参数注入,您应该使用每个请求的生命周期。单例不支持此功能。 (这不包括通过@Context 注入)。

    我做了一个小测试来比较两者的性能。您可以在 github 上找到 sourcesresults。简而言之:我测量了大约 1.5% 的差异。我认为这不会对您的申请产生太大影响。 比较results of the JVisualVM monitoring 我倾向于说每个请求的测试使用更多的内存但是你应该自己决定这是否真的影响你的应用程序。

    【讨论】:

    • 注射后如何扩展?假设我们有几个其他请求范围的类作为资源的依赖项注入,而不是将它们作为单例注入。很高兴知道在这种情况下结果如何扩展。
    • 对不起,我没有测试这个。我认为这不会真正影响您的应用程序的性能。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2010-12-21
    • 2014-04-15
    相关资源
    最近更新 更多