java 数据库批量插入

来源:互联网 发布:守望先锋安娜技能数据 编辑:程序博客网 时间:2024/06/05 00:59
将大批量数据插入到数据库中,用preparedstatement.executeBatch();来做,
这样可以减少与数据库间的交互,
不仅仅只是单纯用addBatch()和executeBatch()就行了,还需要将conn.setAutoCommit(false),
这样关闭自动事务提交,也可以减少交互。
还需注意addBatch()到一定次数是要及时提交,否则容易发生内存溢满的问题。
try {   String url = "jdbc:oracle:thin:@IP:1521:orcl"; // orcl为数据库的SID   String user = "oracle";   String password = "oracle";   StringBuffer sql = new StringBuffer();   sql.append("insert into ex_log (EX_LOG_ID,EX_LOG_DATE) values (?,?)");   Class.forName("oracle.jdbc.driver.OracleDriver");   Connection con = (Connection) DriverManager.getConnection(url,user,password);   // 关闭事务自动提交   con.setAutoCommit(false);   final int batchSize = 10000;   int count = 0;   Long startTime = System.currentTimeMillis();   PreparedStatement pst = (PreparedStatement) con.prepareStatement(sql.toString());   for (int i = 0; i < list.size(); i++) {    ExLog exLog = (ExLog)list.get(i);    pst.setString(1, exLog.getExLogId());    pst.setString(2, exLog.getExLogDate());    // 把一个SQL命令加入命令列表    pst.addBatch();    if(++count % batchSize == 0 ){        pst.executeBatch();        count = 0;    }   }   // 执行批量更新   pst.executeBatch();   // 语句执行完毕,提交本事务   con.commit();   Long endTime = System.currentTimeMillis();   System.out.println("用时:" + (endTime - startTime));   pst.close();   con.close();  } catch (ClassNotFoundException e) {   e.printStackTrace();  } catch (SQLException e) {   e.printStackTrace();  }