由于项目需要,需要将一个6M的txt中的数据插入到oracle数据表中。txt中的数据是每行一个词。经过统计,词总数是505040。为了看起来方便,我将我的所有方法写在类入口中,数据库的信息我会用test代替,代码如下。
public static void main(String[] args) throws IOException, Exception { // TODO Auto-generated method stub Connection conn = null; Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:test", "test", "test"); conn.setAutoCommit(false); PreparedStatement pst = conn .prepareStatement("insert into yq_seq_word values(seq_yq_seq_word.nextval,?)"); InputStreamReader isr = new InputStreamReader(new FileInputStream( new File("C:/Users/Press-Lab/Desktop/test.txt")), "utf-8"); BufferedReader read = new BufferedReader(isr); String s = null; int i = 1; long start = System.currentTimeMillis(); while ((s = read.readLine()) != null) { // 当数据满100条批量插入 if (i % 100 == 0) { // 语句执行完毕,提交本事务 pst.executeBatch(); // 此处的事务回滚是必须的,网上很多代码没有处理,会导致插入数据不完整。 try { conn.commit(); } catch (Exception e) { conn.rollback(); } } else { pst.setString(1, s); pst.addBatch(); } System.err.println(s); i++; } // 由于每次达到100条插入,如果数据不为100的倍数的话,最后一次会剩下一些。下面的代码正好处理剩下的数据 // 语句执行完毕,提交本事务 pst.executeBatch(); try { conn.commit(); } catch (Exception e) { conn.rollback(); } long end = System.currentTimeMillis(); // 此处是打印插入效果 System.out.println("插入" + i + "条,耗时" + (end - start)); read.close(); }
以下是效果的打印。
插入505040条,耗时22796