Jdbc系列八:批量处理

 当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率。
 JDBC的批量处理语句包括下面两个方法:
  addBatch(String):添加需要批量处理的SQL语句或是参数;
  executeBatch():执行批量处理语句;
通常我们会遇到两种批量执行SQL语句的情况:
 多条SQL语句的批量处理;
在这里插入图片描述
 一个SQL语句的批量传参;
在这里插入图片描述
在这里插入图片描述
测试:
 向 Oracle 的 customers 数据表中插入 10 万条记录。测试如何插入, 用时最短。
1、使用 Statement,用时 39567ms

@Test
public void testBatchWithStatement(){
    Connection connection = null;
    Statement statement = null;
    String sql = null;

    try {
        connection = JDBCTools.getConnection();
        JDBCTools.beginTx(connection);

        statement = connection.createStatement();

        long begin = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++){
            sql = "INSERT INTO customers VALUES(" + (i + 1)
                    + ", 'name_" + i + "', '29-6月 -13')";
            statement.addBatch(sql);
        }
        long end = System.currentTimeMillis();

        System.out.println("Time: " + (end - begin)); //39567

        JDBCTools.commit(connection);
    } catch (Exception e) {
        e.printStackTrace();
        JDBCTools.rollback(connection);
    } finally{
        JDBCTools.releaseDB(null, statement, connection);
    }
}

2、使用 PreparedStatement。用时 9819ms

@Test
public void testBatchWithPreparedStatement(){
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    String sql = null;

    try {
        connection = JDBCTools.getConnection();
        JDBCTools.beginTx(connection);
        sql = "INSERT INTO customers VALUES(?,?,?)";
        preparedStatement = connection.prepareStatement(sql);
        Date date = new Date(new java.util.Date().getTime());

        long begin = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++){
            preparedStatement.setInt(1, i + 1);
            preparedStatement.setString(2, "name_" + i);
            preparedStatement.setDate(3, date);

            preparedStatement.executeUpdate();
        }
        long end = System.currentTimeMillis();

        System.out.println("Time: " + (end - begin)); //9819

        JDBCTools.commit(connection);
    } catch (Exception e) {
        e.printStackTrace();
        JDBCTools.rollback(connection);
    } finally{
        JDBCTools.releaseDB(null, preparedStatement, connection);
    }
}

3、使用Batch批量操作,用时 569ms

@Test
public void testBatch(){
	Connection connection = null;
	PreparedStatement preparedStatement = null;
	String sql = null;
	
	try {
		connection = JDBCTools.getConnection();
		JDBCTools.beginTx(connection);
		sql = "INSERT INTO customers VALUES(?,?,?)";
		preparedStatement = connection.prepareStatement(sql);
		Date date = new Date(new java.util.Date().getTime());
		
		long begin = System.currentTimeMillis();
		for(int i = 0; i < 100000; i++){
			preparedStatement.setInt(1, i + 1);
			preparedStatement.setString(2, "name_" + i);
			preparedStatement.setDate(3, date);
			
			//"积攒" SQL 
			preparedStatement.addBatch();
			
			//当 "积攒" 到一定程度, 就统一的执行一次. 并且清空先前 "积攒" 的 SQL
			if((i + 1) % 300 == 0){
				preparedStatement.executeBatch();
				preparedStatement.clearBatch();
			}
		}
		
		//若总条数不是批量数值的整数倍, 则还需要再额外的执行一次. 
		if(100000 % 300 != 0){
			preparedStatement.executeBatch();
			preparedStatement.clearBatch();
		}
		
		long end = System.currentTimeMillis();
		
		System.out.println("Time: " + (end - begin)); //569
		
		JDBCTools.commit(connection);
	} catch (Exception e) {
		e.printStackTrace();
		JDBCTools.rollback(connection);
	} finally{
		JDBCTools.releaseDB(null, preparedStatement, connection);
	}
}
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值