После профилирования приложения я вижу, что большая часть времени тратится на 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 как метод, занимающий большую часть времени проверки.
Подробнее здесь: https://stackoverflow.com/questions/661 ... e-poor-per