MyBatis高效同步百万级数据
一.有一个需求,需要同步百万级的数据。看到要求首先想到的是用存储过程+Job定时批量同步,后来发现这个任务是一表同步多表,且一表上的字段难以满足多表的需求,在对数据的细节处理上使用Java同步更方便,故考虑使用MyBatis foreach list的同步方式。但使用这种同步方式需要考虑性能方面的问题很多。
- 问题一:查询返回的List数据不能太大,不然会报java.lang.OutOfMemoryError: GC overhead limit exceeded;
- 问题二:当表的列数较多(20+),以及一次性插入的行数较多(5000+)时,整个插入的耗时十分漫长,达到了10+分钟,这是不能忍的。
- 问题三:后台的Java定时任务容易耗尽单体应用的cpu资源,导致系统访问变慢,与其他核心模块抢夺cpu资源,拉低系统的整体性能,严重可导致系统宕机
- 优化设计一:百万级数据不可能一次性同步完,毕竟不是ETL数据迁移,使用MyBatis得考虑性能方面的要求,因此这里使用SpringBoot Task分批处理,每次5000条,2分钟执行一次任务;
- 优化设计二:在batchAddList(List
List) 同步的方法里对List进行切割,分批操作。按经验来说,一次性插500~1000行数量是比较合适的,时间消耗也能接受。 - 优化设计三:对于查询需要同步的数据加ROWNUM <= 5000 ,返回的List再分批操作处理,根据插入的性能,一次
还没有评论,来说两句吧...