设为首页 收藏本站
查看: 1091|回复: 0

[经验分享] [原创]java使用JDBC向MySQL数据库批次插入10W条数据测试效率

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-12-13 07:43:08 | 显示全部楼层 |阅读模式
  使用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>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>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秒 ,由此可见处理效率大大提高,呵呵,
  注:文章是博主原创,转载请注明来源啊,谢谢亲!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-423537-1-1.html 上篇帖子: MySQL查询过程中出现lost connection to mysql server during query 的解决办法 下篇帖子: mysql开启binlog日志和慢查询日志
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表