暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第8讲:使用JDBC进行批量操作

何先振 2024-03-26
1055

以下文章来源于何先振,责编小何


使用循环批量新增



update、delete 天生就可以进行批量操作。这里我们主要讲的是如何进行批量新增(insert语句)。


单个新增我们已经会了,只需要写好insert语句,设置好参数值,调用执行方法就可以新增了。


那么现在要是新增1万条记录,我只需要通过一个循环调用1万次执行方法就行了。


先把表记录清空。





编写批量新增代码,通过循环调用excuteUpdate方法进行批量新增。并且记录下插入1万条记录的耗时时间。





执行程序,我们发现插入1万条记录耗时需要83秒





查看表记录,确实添加了1万条数据。





这种批量新增方式效率并不是很高,因为需要频繁的跟数据库交互。我们可以使用另外一种方式,参照输出流的方式,先把二进制的数据,弄个数组存起来。





那么我们也可以把SQL存起来,等后面一起发送给数据库进行执行。这也就是我们的第二种批量插入方式。



通过保存SQL方式批量新增



PreparedStatement提供了可以存储一组SQL的方法。





然后通过批量执行方法,一起把SQL发送给数据库去执行。





清空表数据





重新优化批量新增代码,每次循环保存一条SQL语句,将执行方法放到循环外,结束循环一起发送给MySQL进行执行。





执行程序,发现时间也是差不多,需要82秒。





查看表记录,也成功地插入了1万条数据。





为什么改成批量发送SQL也这么慢呢?


这是因为MySQL数据库默认关闭了批量插入的操作。


我们需要在连接中加上配置:

rewriteBatchedStatements=true,表示允许批量插入。





这个时候我们重新再来一遍。清空表数据。





重新执行程序,这时候只需要0.5秒,效率一下快了好几十倍。





查看表记录,也有1万条数据。





注意点:


SQL语句后面不能带;号。





如果带了分号;会报SQL错误,因为我们循环存SQL的时候,它会把每条数据的SQL都拼到后面。


加了;号表示这条SQL就结束了,拼上去也运行不了。





修改事务批量新增



我们还可以继续优化,使用事务进行批量新增,这也引出我们下讲需要讲解的内容。


我们虽然一次性发送给数据库,但是数据库会默认把每添加一条数据就看成一个事务,执行完一条事务就自动提交一次。


我们可以改成不自动提交,由我们自己人工提交。等执行完所有的SQL,再一起提交事务。


下面我们就来演示,通过修改事务进行批量新增。


首先清空表记录





我们往表里面插入100万条记录。





然后分组进行提交,每保存到1000条记录,进行执行一次。





首先执行,不修改事务的方式,用了28秒。





创建连接对象后,调用setAutoCommit()方法,传入false表示关闭自动提交。





执行完后,通过连接对象调用commit()方法,进行手动提交事务。





运行修改事务手动提交的程序,插入100万条记录,只需要17秒左右。





通过修改事务+保存SQL的方式是批量新增最高效的一种方式了。至于什么是数据库事务,下篇来给大家讲解。



扫码进微信答疑群




点击上方"何先振"关注并选择设为星标
各类IT技术文章不会错过!

文章转载自何先振,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论