【问题标题】:Validation with annotations is slow使用注释进行验证很慢
【发布时间】:2018-03-28 15:45:35
【问题描述】:

为什么spring验证比自己的验证慢? 我不想编写自己的验证器。

在购物车中有 20,000 个项目(没有导致验证异常)并调用我们在这些时间得到的两个休息端点:/test/spring -> 62.145 ms /test/own -> 11.35 毫秒

两个端点运行 200 次。结果的时间是平均时间。 有 20.000 件商品的购物车当然是不现实的,这也不是重点。

    @RequestMapping(path = "/spring", method = RequestMethod.POST)
    public ResponseEntity<Object> postSpringValidation(@RequestBody **@Valid** Cart cart) {
        return new ResponseEntity<>(HttpStatus.CREATED);
    }


@RequestMapping(path = "/own", method = RequestMethod.POST)
    public ResponseEntity<Object> postOwnValidation(@RequestBody Cart cart) {
        if (!cart.isValidData()) {
            throw new InvalidParameterException("invalid data");
        }

        return new ResponseEntity<>(HttpStatus.CREATED);
    }

public class Cart {
    @NotNull
    private String id;

    @Valid
    @NotNull
    private List<Item> items;

    public boolean isValidData() {
        if (id == null)
            return false;

        for (Item item : items) {
            if (!item.isValidData()) {
                return false;
            }
        }

        return true;
    }
}

public class Item {
    @NotNull
    private String id;

    public boolean isValidData() {
        if (id == null)
            return false;

        return true;
    }
}

【问题讨论】:

  • 尝试调试代码 - 你会发现 spring 不仅仅是调用shop.isValidData。但我问自己的问题是:为什么这很重要?这可能不是您想要优化的东西...
  • 需要多少项目才能注意到有意义的差异?对于实际用户来说,该项目数是否现实?
  • 忽略“那是不现实的”的愚蠢回答,你会在 spring 中遇到的一个问题是你为 CPU 时间的便利付出了代价。在很多地方,似乎是反射导致它变慢。如果你希望你的 API 更快,你必须放弃 spring 帮助你的任何东西,包括不使用注释来映射变量和自己写入响应。您应该考虑使用 jvisualvm,因为您可能能够找到 spring 内部的缓慢并提出更改建议。

标签: java spring hibernate validation bean-validation


【解决方案1】:

Spring Validation 实现JSR-303/JSR-349

validation routine part 解释了验证触发时会发生什么。您必须考虑在全球验证框架的工作中涉及什么。

  • 您需要有一些方法来检测哪些类声明了约束,哪些没有声明

  • 您需要一种方法来区分构造函数/方法/字段约束

  • 您需要实现某种对象图来验证深度嵌套的结构

part of the documentation 涵盖了这一切。

与在您的类中使用一个内联方法进行验证相比,操作整个验证基础架构预计会更加繁重。

使用统一的验证方式比使用自定义实现要好。自定义实现容易出错且难以维护。

与自定义验证相比,任何验证框架的性能开销都应该可以忽略不计。

您为您的产品创建了不切实际的案例。 我怀疑您是否有人一次购买了 20K 件物品。即使您允许,客户也将能够付款。大多数支付提供商和银行都会将此交易标记为荒谬并予以否认。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多