数据量有40万条,从一个对象table_01一条一条取数到对象table_02,如果用原始的
Statement Statmt =comm.createStatement(); String sql="insert into tb2...."; Statmt.executeUpdate(sql); newCon.commit();//这里是每执行一条sql插入语句就commit一次 Statmt.close();
当io操作频繁的时候必然会降低sql性能,这里可以采取分批commit的形式减少io操作。
首先定义一个计数器count,当count%1000的时候commit一次,记住最后再commit一次可以把不足1000的剩下数据提交。
其次用batch进行批量提交sql
Statmt.addBatch(sql); Statmt.executeBatch(); if(count%1000==0){ newCon.commit(); Statmt.clearBatch(); }
/** 主意有些操作是不可以分批commit的,比如一个完整的事务提交,否则不方便数据回滚处理。 **/ Connection conn = DBPool.getConnection(); conn.setAutoCommit(false); Statement statmt =conn.createStatement(); statmt.addBatch(sql); statmt.executeBatch(); statmt.addBatch(sql); statmt.executeBatch() ..... statmt.clearBatch(); conn.commit(); /**记得异常回滚和资源关闭*/ statmt.close(); conn.close();
错误归类:
java.sql.BatchUpdateException: 无效的批处理命令: invalid SELECT batch command 0
原因是:sql语句包含了select语句,批量处理只能提交insert、update、delete等操作