普通的执行过程是:每处理一条数据,就访问一次数据库;
而批处理是:累积到一定数量,再一次性提交到数据库,减少了与数据库的交互次数,所以效率会大大提高
但是使用了 addBatch() -> executeBatch() 还是很慢
解决:
a.需配置 参数 在数据库连接URL后面加上这个参数:
dbUrl "jdbc:mysql://localhost:3306/User?rewriteBatchedStatements=true";
b.conn.setAutoCommit(false); 需要设置 手动提交
完整例子:
1.正常JDBC 版本
String sql = "insert into table *****"; con.setAutoCommit(false); ps = con.prepareStatement(sql); for(int i=1; i<65536; i++){ ps.addBatch(); // 1w条记录插入一次 if (i % 10000 == 0){ ps.executeBatch(); con.commit(); } } // 最后插入不足1w条的数据 ps.executeBatch(); con.commit();
2.Spring boot jdbc版本
@Autowired
private JdbcTemplate jdbcTemplate;
private void batchInsertOrUpdateGoodsTemp(List<GoodsTemp> list){ StringBuilder sql = new StringBuilder("INSERT INTO `gds_goods_temp` (`CAT_CODE`, `BRAND_CODE`, `GOODS_SN`, `GOODS_STATUS`, `GOODS_NAME` ").append( ", `IS_MARKET`, `IS_DELETE`, `GOODS_INTRO`, `GOODS_DETAIL`, `UNIT`, `WEIGHT`, `SPEC`, `BARCODE`, `GOODS_IMG`, `GOODS_THUMB`, `GOODS_GALLERY_IMGS`") .append(", `MARKET_PRICE`, `REMARK`, `ADD_TYPE`, `ADD_MCH_NO`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); KeyHolder key = new GeneratedKeyHolder(); this.jdbcTemplate.update(con -> { con.setAutoCommit(false); PreparedStatement preState =null; try { preState = con.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS); for(GoodsTemp temp : list){ preState.setString(1, temp.getCatCode()); preState.setString(2, temp.getBrandCode()); preState.setString(3, temp.getGoodsSn()); preState.setString(4, temp.getGoodsStatus()); preState.setString(5, temp.getGoodsName()); preState.setString(6, temp.getIsMarket()); preState.setString(7, temp.getIsDelete()); preState.setString(8, temp.getGoodsIntro()); preState.setString(9, temp.getGoodsDetail()); preState.setString(10, temp.getUnit()); preState.setBigDecimal(11, temp.getWeight()); preState.setString(12, temp.getSpec()); preState.setString(13, temp.getBarcode()); preState.setString(14, temp.getGoodsImg()); preState.setString(15, temp.getGoodsThumb()); preState.setString(16, temp.getGoodsGalleryImgs()); preState.setBigDecimal(17, temp.getMarketPrice()); preState.setString(18, temp.getRemark()); preState.setString(19, temp.getAddType()); preState.setString(20, temp.getAddMchNo()); preState.addBatch(); } preState.executeBatch(); con.commit(); } catch (SQLException e) { log.error("sql语句{},批量执行错误:{}", sql,e.getMessage()); } return preState; }, key); }
相关推荐
一、JDBC的批量插入 一、JDBC的批量更新 一、JDBC的批量删除 一、JDBC的批量修改
Mybatis与JDBC批量插入MySQL数据库性能测试,资源包含文档、代码和数据库。
NULL 博文链接:https://sunfish.iteye.com/blog/1455357
针对oracle中blob字段的操作,能批量快速的插入大字段,效率非常高
解决kettle使用表输出到hive2时,批量提交不起作用导致速度非常慢的问题,重新编译big-data-plugin插件使表输出支持对hive2批量提交,速度由几十条每秒提升到三千条每秒。
NULL 博文链接:https://superjavason.iteye.com/blog/255423
主要为大家详细介绍了java实现jdbc批量插入数据,三种JDBC批量插入编程方法进行比较,感兴趣的朋友可以参考一下
java 大数据导入工具类 jdbc 大数据导入数据库工具类 java
JDBC批量处理问题~~提高更新处理速度~~
文章地址:...Java-JDBC【之】批量插入操作、优化取消自动提交(提速40+倍) 1.JDBC批量操作 2.两种实现方式 3.优化,取消自动提交 4.完整源码 《目录:Java-JDBC学习(编写中...)》 《幕》
主要介绍了Hibernate+JDBC实现批量插入、更新及删除的方法,结合实例形式较为详细的分析了Hibernate与JDBC针对数据库的批量操作相关实现技巧,需要的朋友可以参考下
JDBC连接Oracle数据库常见问题及解决方法
主要介绍了JDBC连接MySQL数据库批量插入数据过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
详细介绍JDBC的连接操作数据库、处理大数据、批处理使用操作 Sun公司为了简化数据库开发,定义了一套JDBC接口,这套接口由数据库厂商去实现,这样,开发人员只需要学习JDBC接口, 并通过JDBC加载具体的驱动,就可以...
该资源主要实现如下功能,利用poi获取excel中大量数据,然后利用jdbc批量插入到mysql
JDBC使用MySQL处理大数据+事务控制管理.txt
spring jdbc Templatetest 访问mysql数据库,批量插入数据
jdbc的三种批量 不要错过,下载后绝不后悔
java 利用 jdbc 向 mysql 数据库插入记录并返回插入记录生成的主键值
Ambari搭建hadoop环境下,hive的数据导入