Hibernate Validation 6.0 ListValueExtractor.extractValues, похоже, имеет низкую производительность при работе с большимиJAVA

Программисты JAVA общаются здесь
Anonymous
Hibernate Validation 6.0 ListValueExtractor.extractValues, похоже, имеет низкую производительность при работе с большими

Сообщение Anonymous »

Я использую Hibernate Validation 6.x. У меня есть поле в проверяемом объекте, содержащее список, например List double. Проблема, с которой я столкнулся, заключается в том, что когда список очень велик, производительность снижается существенно. Чтобы исследовать проблему, я реализовал проверку элементов списка в качестве специального средства проверки в списке, @ValidDoubles List double, используя поток для перебора элементов, и добился повышения производительности примерно на 65 %. валидатор.
После профилирования приложения я вижу, что большая часть времени тратится на ListValueExtractor.extractValues, который можно найти здесь. Я надеюсь, что кто-нибудь сможет объяснить, почему этот метод кажется таким дорогим и существуют ли известные обходные пути.
Пример объекта:

Код: Выделить всё

public class myDataObject {

private List doubles // List which can contain thousands of values

// Getters and Setters
}
Обновление
После дальнейшего профилирования и расследования я считаю, что проблема связана с тем, что Hibernate отслеживает, какие bean-компоненты уже были были проверены при выполнении каскадной проверки, в частности при использовании System.identityHashCode (Вот код).
Глядя на свой профилировщик, я вижу, что 11.6 % времени ЦП тратится на проверку входных компонентов. Из этого времени 11,3% времени тратится на вызов System.identityHashCode. Интересно, что это второй дочерний объект, на который тратится время, хотя они содержат относительно простые проверки. Интересно, неправильно ли я настроил валидатор или bean-компоненты, поскольку это кажется очень странным.
Моя конфигурация валидатора выглядит так: Вызов валидатора:

Код: Выделить всё

Set violations = validator.validate(input);
Пример структуры объекта

Код: Выделить всё

public class InputObject {
@NotNull
String name;

@Valid
List firstChildren; // on average 10 objects but can be up to very large

// Getters and Setters
}

public class FirstChild {
@SomeCustomValidator // Not important
Integer someValue;

// 3 to 4 further fields with simple validators

@Valid
List secondChildren; // On average around 40 objects but can be very large

// Getters and Setters
}

public class SecondChild {
@NotBlank
String foo;

@NotBlank
String bar;

// Getters and Setters
}
В заключение:
  • С точки зрения профилировщика, проблема заключается в каскадных проверках, найденных в @Valid аннотации в списках.
  • Похоже, проблема связана с тем, что Hibernate отслеживает, какие объекты уже проверены при выполнении каскадной проверки.
  • Профилировщик показывает System.identityHashCode как метод, занимающий большую часть времени проверки.
Это проблема оптимизации с Hibernate или я могу настроить свой валидатор или структуру входного объекта каким-либо образом, чтобы обеспечить лучшую производительность?

Подробнее здесь: https://stackoverflow.com/questions/661 ... e-poor-per

Вернуться в «JAVA»