背景
系统用于实现数据传输采集,在不允许库对库传输,甚至跨库(mysql->oracle)传输的情况下,使用自开发采集器进行数据传输。
mybatis插入数据库我们都知道有一种通过foreach来实现batch插入的方式,之前在mysql和oracle上都做过单表插入测试,其中无事务的情况下,8G内存4核PC,每次10000条内插入,mysql上性能差距不大。在8G内存,8核CPU情况下,每次3000条数据,事务插入和batch插入(Oracle batch插入语法需要更换为union all),性能测试如下(一次3000条)
事务for循环插入 | batch批量插入(根据字段数拆分批次for循环插入) |
---|---|
2.306秒 | 0.312秒 |
2.165秒 | 0.562秒 |
2.306秒 | 0.14秒 |
2.227秒 | 1.112秒 |
2.251秒 | 0.661秒 |
可以发现性能差距明显,无事务for循环插入就不用比较了,跟事务for循环的差距都在10倍以上。
运用
根据测试结果,将原先旧的事务for循环改为batch插入,并运用到生产环境中,结果瞬间爆炸。
生产环境使用Kafka队列提取数据写入oracle,分区数为3,理论并发为3,实际上采集接口设计为异步,加上其他业务需求,关系库写入并发实际上可以达到29~35(oracle active事务)。
服务器ORACLE 8核CPU直接100%爆满,大量的timeout无响应,死锁数激增,这是之前使用事