Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)
程序员文章站
2024-03-08 19:52:28
使用jdbc连接mysql数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?
在jdbc编程接口中statement 有两个方法特别值得...
使用jdbc连接mysql数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢?
在jdbc编程接口中statement 有两个方法特别值得注意:
通过使用addbatch()
和executebatch()
这一对方法可以实现批量处理数据。
不过值得注意的是,首先需要在数据库链接中设置手动提交,connection.setautocommit(false)
,然后在执行statement之后执行connection.commit()
。
import java.io.bufferedreader; import java.io.ioexception; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.sqlexception; import java.util.date; import com.mysql.jdbc.connection; public class mysqlbatchutil { private string sql="insert into db_test (param1,param2,param3,param4,param5) values (?,?,?,?,?)"; private string charset="utf-8"; private string connectstr="jdbc:mysql://localhost:3306/test"; private string username="root"; private string password="123456"; private void dostore() throws classnotfoundexception, sqlexception, ioexception { class.forname("com.mysql.jdbc.driver"); connectstr += "?useserverprepstmts=false&rewritebatchedstatements=true";//此处是测试高效批次插入,去掉之后执行时普通批次插入 connection conn = (connection) drivermanager.getconnection(connectstr, username,password); conn.setautocommit(false); // 设置手动提交 int count = 0; preparedstatement psts = conn.preparestatement(sql); string line = null; date begin=new date(); for(int i=0;i<=100000;i++){ psts.setstring(1, i+"param1"); psts.setstring(2, i+"param2"); psts.setstring(3, i+"param3"); psts.setstring(4, i+"param4"); psts.setstring(5, i+"param5"); psts.addbatch(); // 加入批量处理 count++; } psts.executebatch(); // 执行批量处理 conn.commit(); // 提交 date end=new date(); system.out.println("数量="+count); system.out.println("运行时间="+(end.gettime()-begin.gettime())); conn.close(); } public static void main(string[] args) { try { new mysqlbatchutil().dostore(); } catch (classnotfoundexception e) { e.printstacktrace(); } catch (sqlexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } }
测试结果:
数量=100001
运行时间=4725
一共10w,执行时间一共花费 47 秒.
这个效率仍然不高,似乎没有达到想要的效果,需要进一步改进。
在mysql jdbc连接字符串中还可以加入参数,
rewritebatchedstatements=true
mysql默认关闭了batch处理,通过此参数进行打开,这个参数可以重写向数据库提交的sql语句
useserverprepstmts=false
如果不开启(useserverprepstmts=false),使用com.mysql.jdbc.preparedstatement进行本地sql拼装,最后送到db上就是已经替换了?后的最终sql.
在此稍加改进,连接字符串中加入下面语句(代码构造方法中去掉注释):
connectstr += "?useserverprepstmts=false&rewritebatchedstatements=true";
再次测试结果如下:
数量=100001
运行时间=1213
同样的数据量,这次执行只花费了12秒 ,由此可见处理效率大大提高,呵呵
以上所述是小编给大家介绍的java使用jdbc向mysql数据库批次插入10w条数据测试效率,希望对大家有所帮助
上一篇: java随机抽取指定范围内不重复的n个数