java mysql 批量插入效率_Java使用JDBC向MySQL数据库批次插入10W条数据(测试效率)

使用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条数据测试效率,希望对大家有所帮助

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值