记一次迷信batch insert导致的性能急剧下降问题

背景

系统用于实现数据传输采集,在不允许库对库传输,甚至跨库(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无响应,死锁数激增,这是之前使用事

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值