hibernator-validator(hibernate validate工具,小心你的姿势不对)
系统运营后台有个导入线下交易的功能 。产品和运营反馈 ,当excel数据量超过8千条时 ,会变得超级慢 ,动辄要等三四十秒 。
哎!这么慢 ,搁谁能不闹心呢?
基于此 ,这两天 ,我觉得优化一下 ,可是 ,一来二去 ,从昨天周一到现在眼看两天了 ,对代码进行各种排查和调整 ,还是没有达到理想的效果————至少 ,别让用户傻傻等待超过5秒吧,最次也不能超过10秒吧 。
这两天特殊时期 ,公司的保洁阿姨应该也阳了 ,始终没来上班 。那么,卫生工作就得我们上班族自理了 。
我四下张望一下 ,两个垃圾桶都满了 。再看小伙伴们都在安静的码代码 。我就收拾一下吧 。在提着垃圾袋扔垃圾的路上 ,突然灵光乍现 。是不是数据校验那块导致的呢?————校验用的是Hibernate的validation-api 。
完事回到工位 ,赶紧试试 。
————峰回路转 。
果然 ,本地测试才惊人地发现 ,用Hibernate的校验工具 ,8200条数据耗时47s ,而直接用apache common的util类校验 ,仅需1~2s。
why?
why?
why?
程序使用不当所致 。先贴出来关键代码:
当针对为数不多的对象来校验 ,发现不出来性能问题 。但是 ,当达到上面的8000多条数据时 ,那性能可以差太多了。
细看控制台打印出来的log ,可见一斑 。
问题出在 validatorFactory 和 validator 这两个局部对象的初始化上 。尤其是初始化 validatorFactory调用Validation#buildDefaultValidatorFactory, 这个方法内部会涉及到xml文件的读取和类映射 ,可见 ,每次都做这个事情,CPU表示很无辜!
问题即答案————>优化方案是将这2个对象的初始化放在类初始化时 。
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!