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条数据测试效率,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
评论

打赏作者

wb0r0r

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值