日期:2014-05-16 浏览次数:20499 次
最近在项目中接触到一个需要将大批量数据一次性导入数据库的需求,考虑过用ORACLE的LOADRUUNER批量导入,但是考虑到产品需要支持多数据库,并且在导入过程中还有许多的加工逻辑,所有最后决定用最原始的方法,呵呵。
需求中的数据量大约在20W条记录左右,最开始的方案是通过JDBC,逐条插入。这样做的效率奇慢,整个插入操作可能需要1分钟以上。后来发现JDBC的prepareStatement有一个批量操作的方法(addBatch),使用此方法后,20W的数据量大约能在2-3秒的时间导入数据库中,以前确实没发现,大家别拍我。
使用addBatch和使用prepareStatement是很相似的,将原有的execute方法替换成addBatch方式即可,最后再执行executeBatch方法即可。但是此方法有个限制,每次最多批量导入6W多行数据,为解决此问题,需要添加一个计数,每5W记录提交一次。
示例代码如下:
Connection conn; PreparedStatement pst; 。。。//初始化连接等 String sqlStr = "insert into tableName (col1,col2) values (?,?)"; conn.setAutoCommit(false); pst = conn.prepareStatement(sqlStr); int recordNum = 0; //计数器 for(int i = 0; i < 200000; i++){ recordNum++; //计数 pst.setString(1, "value1"); pst.setString(2, "bbq"); //5W提交一次 if (recordNum % 50000 == 0) { pst.executeBatch(); conn.commit(); conn.setAutoCommit(false); pst = conn.prepareStatement(sqlStr); } } //提交剩余记录 if (recordNum % 50000 != 0) { pst.executeBatch(); conn.commit(); } pst.close(); conn.close();