Java 使用LocalValidatoryFactoryBean的性能问题
我试图理解为什么我的程序执行时间这么长。我的程序的目标是导入CSV数据,并逐行验证它 似乎我90%的执行时间都花在了数据验证上。 这是我的验证功能:Java 使用LocalValidatoryFactoryBean的性能问题,java,spring,performance,validation,jakarta-ee,Java,Spring,Performance,Validation,Jakarta Ee,我试图理解为什么我的程序执行时间这么长。我的程序的目标是导入CSV数据,并逐行验证它 似乎我90%的执行时间都花在了数据验证上。 这是我的验证功能: public static <T> HashSet<ConstraintViolation<T>> validate(Validator validator, T resource, Class<?>... groups) { return (HashSet<ConstraintViol
public static <T> HashSet<ConstraintViolation<T>> validate(Validator validator, T resource, Class<?>... groups) {
return (HashSet<ConstraintViolation<T>>) validator.validate(resource, groups);
}
我使用的验证器是LocalValidatorFactoryBean,在Spring中导入,如下所示:
<bean id="validator" name="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
我注意到验证在每次迭代中花费越来越多的时间。。。例如,如果我的CSV文件中有1000行类似的代码,第一行将在~55毫秒内验证,最后一行将在~900毫秒内验证
我不知道如何解释这种非线性执行时间,以及如何改进它:我有没有犯任何错误?我应该以不同的方式配置bean吗?我应该使用其他验证器吗?哪一个
谢谢您的时间:您不是在使用LinkedList吗?这可以解释增长时间的原因,假设有许多列,并且对字段的访问不缓存行
尝试用一些无操作来代替验证,并观察时间是否改变。或者简单地调试一个调用,或者让它抛出并查看stacktrace,看看发生了什么有趣的事情。你在验证什么。什么是T资源?你确定验证需要这么长时间吗?如果您使用的是JPA,那么验证可能也会完成,并且可能会随着YOUR一级缓存中实体的数量增加而增加。例如,我检查第一列是否是数字,第二列是否是介于5到255个字符之间的字符串,并遵循一些其他规则,等等。。。CVS文件可以很容易地为我必须处理的数据提供100列,每列可以有1-5条规则。顺便说一句,我确信我的验证函数几乎占用了所有时间~90%。是的,我使用的是JPA Hibernate。好的,检查你的验证逻辑,也正如前面提到的,Hibernate也使用验证,所以如果这也是混合的话,你甚至没有重复的验证,如果发生更改,基本上每个选择都会得到脏检查的性能。随着每个对象添加到一级缓存中,这将以非常线性的方式增加。但目前,如果看不到代码、配置等,很难判断。