第一次写博客,写的不好请多多包涵。欢迎评论

今天需要对mysql做一个批量插入的操作,使用的是原生的jdbc对mysql进行操作,大约插入20几万条数据,刚开始事务是自动提交的,插完数据大约用了4分钟,后来把事务改为手动提交,插完数据用了20秒,时间相缩短了十倍。

          如果不设置手动提交事务,那么默认每条插入语句都是一个事务,每次都要提交事务。设置手动提交事务的话,可以在循环前开启事务,循环结束后再提交事务,只需要提交一次事务。

下面是代码
@Test
public void getModelDetailLogV2(){/*数据源*/List<ModelShowDetailLogV2> all = modelShowLDetailLogV2Service.findAll();Connection connection = null;try {// 1.加载MySQL的驱动Class.forName("com.mysql.jdbc.Driver"); /*连接数据库的参数*/connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/log_repeat", "root", "root");/*插入的sql*/String sql="INSERT into modelshowdetaillogv2(id,showId,email,browserTime,time,result,\n" +"platform,tipAmount,detail,modelShowId,logNo,logType,timeDate,customerName) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)";connection.setAutoCommit(false);//将自动提交关闭,开启手动提交PreparedStatement preparedStatement = connection.prepareStatement(sql);long start=System.currentTimeMillis();/*循环插入*/for (int i=0;i<all.size();i++){preparedStatement.setString(1,all.get(i).getId());preparedStatement.setString(2,all.get(i).getShowId());preparedStatement.setString(3,all.get(i).getEmail());preparedStatement.setLong(4,all.get(i).getBrowserTime());preparedStatement.setLong(5,all.get(i).getTime());preparedStatement.setInt(6,all.get(i).getResult());preparedStatement.setString(7,all.get(i).getPlatform());preparedStatement.setInt(8,all.get(i).getTipAmount());preparedStatement.setString(9,all.get(i).getDetail());preparedStatement.setString(10,all.get(i).getModelShowId());preparedStatement.setString(11,all.get(i).getLogNo());preparedStatement.setString(12,all.get(i).getLogType());preparedStatement.setLong(13,all.get(i).getTimeDate());preparedStatement.setString(14,all.get(i).getCustomerName());preparedStatement.addBatch();//把数据放入缓存区if(i%10000==0){//刷新缓存区preparedStatement.executeBatch();preparedStatement.clearBatch();//清除之前的数据}}//刷新缓存区preparedStatement.executeBatch();preparedStatement.close();connection.commit();//执行完后,手动提交事务connection.setAutoCommit(true);//在把自动提交打开System.out.println("插入完成");long end=System.currentTimeMillis();System.out.println("花费时间:"+(end-start));} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}finally{if(connection != null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}}

mysql使用jdbc进行批量插入时把事务设为手动提交比事务自动提交速度快了10倍相关推荐

  1. JDBC executeBatch批量插入数据

    JDBC executeBatch批量插入数据 JDBC executeBatch批量插入数据 JDBC executeBatch批量插入数据 con.setAutoCommit(false); 项目 ...

  2. ### jdbc 向数据库插入特殊字符 失败。SQL报错的问题。【批量插入时手动解决特殊字符,根本不现实!!】

    ==== 不禁感叹:框架就是框架!!!不需要再手动处理很多业务以外的 各种繁琐处理. [这也是为什么 生产环境 基本只使用 框架的原因!] ===批量插入SQL如何写的[重点!] 版本1: [old] ...

  3. MySQL + MyBatis 批量插入时存在则忽略或更新记录

    一.存在时则忽略 为什么在发现重复时会忽略?这里面涉及到两个地方. 1.重复则忽略.那么首先是需要判断是否重复,这里是通过唯一索引判断是否重复的.如果表中唯一索引的字段已经存在与将要插入的记录行中唯一 ...

  4. Sql批量插入时如果遇到相同的数据怎么处理

    测试数据 -- 创建测试表1 CREATE TABLE `testtable1` ( `Id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `UserId` I ...

  5. mysql基础----mybatis的批量插入(一)

    这里面记录一下使用mybatis处理mysql的批量插入的问题,测试有可能不准.只愿世间风景千般万般熙攘过后,字里行间,人我两忘,相对无言. mybatis的批量插入 我们的测试主体类是springb ...

  6. JDBC:批量插入数据操作

    批量插入操作 举例: 向数据表中插入20000条数据 数据库中提供一个goods表.创建如下: CREATE TABLE goods( id INT PRIMARY KEY AUTO_INCREMEN ...

  7. 用python操作mysql数据库(之批量插入数据)

    #!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb #建立连接 conn = MySQLdb.connect(host='127. ...

  8. MySQL 通过子查询批量插入数据

    1 需求 需要将 a 表的数据插入 b 表,其中 a 表的数据很多是冗余的,是原始的多级分类数据,b 表相当于是对 a 表的简化,去掉冗余的数据,两表的 pdm 如下图: 2 方法 将 a 表的各级编 ...

  9. JDBC进行批量插入数据操作

    目录 1.方式一:使用PreparedStatement 2.方式二:使用addBatch(),excuteBatch(),clearBatch() 3.方式三:设置不允许自动提交数据 4.总结 1. ...

最新文章

  1. 前端那些年----Webstream快捷键备忘(mac)
  2. 在MFC,Win32程序中向控制台(Console)窗口输出调试信息
  3. [Redux/Mobx] 举例说明怎么在redux中定义action?
  4. 项目class第十四周项目一:动物学叫
  5. 日积月累系列之分页控件(js源码)
  6. dz email地址无效_Zcash屏蔽地址漏洞或揭示全节点IP地址(附解决方案)
  7. mysql主从同步图
  8. spark架构设计编程模型 02
  9. 深度报告:移动边缘计算,站在5G“中央”
  10. 邮箱登陆时显示服务器连接失败,邮箱显示无法连接服务器
  11. nvivo服务器项目,【NVivo教程】用Nvivo为研究团队设立主项目
  12. 组合投资的风险与收益概述
  13. Word04---字体
  14. 【COMSOL官方案例仿真练习】球体之间电击穿
  15. LeetCode 695. 岛屿的最大面积【c++/java详细题解】
  16. OpenGL 法线贴图Normal Mapping
  17. 养生视野·新知(四)
  18. 科学计算极速图形工作站
  19. 对SAP中的公司、公司代码和工厂的理解
  20. 开发一个delphi写的桌面图标管理代码

热门文章

  1. 知网论文caj怎么转化成word
  2. 21-Chrome开发者工具:利用网络面板做性能分析
  3. android游戏后台运行点击桌面游戏图标游戏重启的解决方法
  4. win7与深度(Deepin)linux 双系统启动顺序调整
  5. 192.168.8.1手机登陆_192.168.1.101登陆页面手机进入 即可登陆
  6. 地图分幅编号C 语言编程,地图分幅编号的计算
  7. 186_一文看懂压敏电阻和tvs的区别
  8. 【信息】三方协议签订相关问题及解答
  9. Linux Centos 7 实现java控制打印机打印文件**
  10. matplotlib刻度值使用科学记数法