`

jdbc 大数据批量插入很慢问题解决

 
阅读更多

 

 普通的执行过程是:每处理一条数据,就访问一次数据库;

而批处理是:累积到一定数量,再一次性提交到数据库,减少了与数据库的交互次数,所以效率会大大提高

 但是使用了 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(Java Database Connectivity)是Java平台中用来标准地连接数据库的技术。通过JDBC,Java应用程序可以与多种类型的数据库进行交互,实现数据的读取、写入等功能。批量操作是指在一次...

    jdbc-批量插入数据

    本文将深入探讨如何使用JDBC进行批量插入数据,这在处理大量数据时能显著提高性能。 批量插入数据是数据库操作中常见的一种优化策略,特别是在数据分析、数据迁移或大数据处理等场景。传统的单条插入方式可能会导致...

    Mybatis与JDBC批量插入MySQL数据库性能测试

    本文将探讨Mybatis和JDBC在批量插入MySQL数据库时的性能差异,并提供相关的测试资源。 首先,JDBC(Java Database Connectivity)是Java平台中用于与数据库交互的一种规范,它允许程序员使用SQL语句直接操作数据库...

    jdbc批量插入大字段

    在Oracle数据库中,Blob类型用于存储大量的二进制数据...总之,批量插入大字段是处理大量Blob数据的关键策略,通过JDBC提供的批处理功能,结合合理的事务管理和内存管理,可以显著提升Oracle数据库中的大数据插入效率。

    kettle批量插入hive2,解决表输出速度慢问题

    ### Kettle 批量插入Hive2:解决表输出速度慢问题 #### 一、问题背景及原因分析 在使用Kettle进行数据处理时,尤其是将数据从源系统传输到目标系统的过程中,如果目标系统是Hive2,则可能会遇到表输出速度极其缓慢...

    利用JDBC解决大数据查询的问题

    ### 利用JDBC解决大数据查询的问题 #### 一、问题背景 在处理大数据查询时,经常遇到的一个问题是由于查询结果集过大而导致的性能瓶颈,尤其是当这些数据需要被加载到客户端应用程序的内存中时。这种情况下的常见...

    三种JDBC批量插入编程方法的比较

    在Java的数据库编程中,JDBC(Java Database Connectivity)提供了多种方法来实现数据的批量插入,从而提高数据库操作的效率。本篇文章将深入探讨三种不同的JDBC批量插入编程方法,并进行对比分析,以帮助开发者更好...

    Hibernate+JDBC实现批量插入、更新及删除的方法详解

    Hibernate+JDBC实现批量插入、更新及删除的方法详解 概述:本文主要介绍了Hibernate+...本文通过实例形式详细分析了Hibernate+JDBC实现批量插入、更新及删除的方法,提供了批量操作的各种技巧和解决方案,供大家参考。

    JDBC连接Oracle数据库常见问题及解决方法

    "JDBC连接Oracle数据库常见问题及解决方法" 本文将对 JDBC 连接 Oracle 数据库常见问题进行总结和解决方法的介绍。以下是针对不同问题的解决方案: 1. Jbuilder 正确连接 Oracle 数据库需要注意的几个问题 在使用...

    java实现jdbc批量插入数据

    本篇文章将详细介绍如何使用Java实现JDBC批量插入数据,并比较三种常见的JDBC批量插入编程方法。 **方法一:使用PreparedStatement加批量的方法** PreparedStatement是Statement的子接口,允许预编译SQL语句,这...

    JDBC连接MySQL数据库批量插入数据过程详解

    "JDBC连接MySQL数据库批量插入数据过程详解" 本文主要介绍了使用JDBC连接MySQL数据库批量插入数据的过程详解,通过示例代码详细介绍了批量插入数据的步骤,对大家的学习或者工作具有一定的参考学习价值。 一、JDBC...

    JDBC的批量处理语句

    使用 JDBC 批量处理语句可以解决两种常见的情况:一种是多条 SQL 语句的批量处理,另一种是同一条 SQL 语句的批量传参。对于第一种情况,我们可以使用 JDBC 的批量处理语句,创建一个 Statement 对象,然后 addBatch...

    Mybatis 3+Mysql 实现批量插入

    在IT领域,尤其是在数据库操作与框架应用中,批量插入数据是一项常见且重要的需求。相比于单条插入,批量插入能够显著提升数据处理效率,减少数据库I/O操作,从而提高整体性能。本文将深入探讨如何利用MyBatis框架...

    oracle数据库中批量插入问题

    2. **使用PL/SQL或外部编程语言(如C#、Java等)**:通过编程接口(如ODBC、JDBC、Oracle Data Provider for .NET等)进行批量插入操作。这种方式更灵活,可以适应更复杂的数据处理需求。 ### C#代码示例解析 提供...

    spring jdbc Templatetest 访问mysql数据库,批量插入数据

    本主题将详细讲解如何使用Spring JDBC Template访问MySQL数据库并进行批量插入数据的操作。 首先,我们需要在项目中引入Spring框架的相关依赖,通常包括`spring-context`和`spring-jdbc`。这些可以在Maven或Gradle...

    Java实现mybatis批量插入数据到Oracle

    本篇文章将详细介绍如何利用Java和MyBatis实现批量插入数据到Oracle数据库中。 首先,我们需要理解Oracle数据库的一些基本概念。Oracle是世界上最流行的商业关系型数据库管理系统之一,以其强大的功能和高可靠性而...

    Java-JDBC【源码】批量插入操作、优化取消自动提交(提速40+倍)

    文章地址:...Java-JDBC【之】批量插入操作、优化取消自动提交(提速40+倍) 1.JDBC批量操作 2.两种实现方式 3.优化,取消自动提交 4.完整源码 《目录:Java-JDBC学习(编写中...)》 《幕》

    java代码oracle数据库批量插入

    这段Java代码通过JDBC实现了向Oracle数据库批量插入数据的功能。关键步骤包括:建立数据库连接、准备SQL语句、批量添加SQL语句到批处理队列、执行批处理以及事务提交。这种方式相比于逐条插入数据,可以显著提升插入...

    JDBC详解(连接操作数据库、处理大数据、批处理)

    4. **大数据处理**:虽然JDBC本身并不是专门针对大数据场景设计的,但可以利用其批量操作等特性来优化大数据处理流程。 综上所述,JDBC为Java开发者提供了一套强大且灵活的工具集,使他们能够在不同的数据库环境中...

    批量插入大量数据

    在实际操作中,你可能需要结合具体的技术栈,例如Python的pandas库配合SQLAlchemy,Java的JDBC,或者是Node.js的Sequelize等,使用它们提供的批量插入接口。同时,要关注数据库类型,如MySQL、PostgreSQL、Oracle或...

Global site tag (gtag.js) - Google Analytics