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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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