首页 > 技术文章 > JDBC批量插入性能简单分析

linglongfang 2020-04-13 13:25 原文

批量插入性能分析:仅仅针对性能

  1.使用Statement对象,一次一个,循环插入

  2.使用PreparedStatement对象,一次一个,循环插入

  3.使用PreparedStatement对象,使用addBatch(),executeBatch(),clearBatch()实现批量插入

    注意事项:

    1)数据库的驱动需要是5.1.37之后的版本,否则不支持批量操作

    2)mysql数据库默认不开启批量操作,需要在数据库的url后面加上:?rewriteBatchedStatements=true

    url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true

  4.使用批量插入的同时加上事务管理,一次性提交。

分析一:使用Statement,一次一个,循环插入

  缺点:

  1.每个sql语句都需要进行字符串拼接:效率极差

  2.可能造成内存溢出(sql字符串对象太多)

  3.每次执行一次,数据库每次都要编译一遍sql语句再执行:效率极差

分析二:使用PreparedStatement对象,一次一个,循环插入

  缺点:

  1.每次执行一次,数据库都要执行一次语句:效率差

  优点:

  1.预编译sql语句,省却了数据库多次编译sql语句,只需要一条sql语句,剩下的填充参数即可

分析三:使用PreparedStatement对象,并使用addBatch(),executeBatch(),clearBatch()实现批量插入

  优点:

  1.每次都是多个sql语句一起执行,而且不需要多次 编译,大大节省了系统开销,并增加的插入速度,推荐使用

分析四:在3的基础上使用事务

  优点:一次性将事务中批量插入的数据,持久化到数据库中,不需要多次提交,大大加快的数据的持久化速度和安全性。

参考代码如下(工具类没给,异常未处理,为了简化代码,勿怪)

@Test
public void test() throws Exception {
    Connection connection = JDBCUtils.getConnection(); //获取连接对象
    connection.setAutoCommit(false); //设置事务不自动提交
    String sql = "insert into goods(`name`) values(?)";//预编译sql语句
    PreparedStatement ps = connection.prepareStatement(sql);
    for(int i = 0 ; i< 2000000 ; i++){  
        ps.setObject(1,"name"+i); //填充参数
        ps.addBatch(); //攒sql
        if(i % 5000 == 0){
            ps.executeBatch();
            ps.clearBatch();
        }
    }
    ps.executeBatch();//防止漏掉数据
    connection.commit();//提交事务
    JDBCUtils.close(connection,ps);//关闭资源
}

 

  

 

  

  

推荐阅读