標籤:
今天在項目中碰到一個問題,就是需要批量提交10000條語句,
剛開始使用的是statement.addBatch(),結果提交的時候發現需要26秒;
檢查半天,發現批量提交的時候也要關掉自動認可(重要),不然極其影響效能。
改了一下程式,最終代碼如下,執行時間為1秒鐘:
1 // 擷取一個串連 2 Connection conn = null; 3 PreparedStatement pstm = null; 4 try { 5 conn = DBConnectionManager.getInstance().getConnection( 6 ConfigDef.DS_UPDATE_KEY); 7 conn.setAutoCommit(false); 8 // statement = conn.createStatement(); 9 Map<String, String> resultMap = collectResult.get(0);10 //擷取第一個11 StringBuilder keyParams = new StringBuilder();12 StringBuilder valueParams = new StringBuilder();13 for (Map.Entry<String, String> entry : resultMap.entrySet()) {14 keyParams.append(", ").append(entry.getKey());15 valueParams.append(", ? ");16 }17 String sqlTemplate = MessageFormat.format(SqlConstant.INSERT_SQL_TEMPLATE, new Object[]{"TB_BMP_SXAUDIT_DATA_TEMP",keyParams,valueParams});18 logger.info("sqlTemplate:"+ sqlTemplate);19 pstm = conn.prepareStatement(sqlTemplate); 20 21 int len = collectResult.size();22 String uid = auditObject.getAuditObjectId()+"_"+ taskSeq;23 for (int i = 0; i < len; i++) {24 25 // 對於每一個結果,都要產生往暫存資料表插入一條SQL語句26 resultMap = collectResult.get(i);27 //第一個參數是UID28 pstm.setString(1, uid);29 // 第2個參數是TASK_ID30 pstm.setInt(2, taskInfo.getPlanId());31 // 第3個參數是BATCH_NO32 Date batchNO = new Date(format.parse(receiveTask.getTaskStartTime()).getTime());33 System.out.println(batchNO);34 pstm.setDate(3, batchNO);35 //第4個參數是CollectID36 pstm.setLong(4,Long.valueOf(auditObject.getAuditObjectId()));37 // 第5個參數是TARGET_DB38 pstm.setString(5, auditObject.getTargetDb());39 // 第8個參數是AUDIT_TIMES40 pstm.setInt(6,1);41 int idx = 7;42 for (Map.Entry<String, String> entry : resultMap.entrySet()) {43 pstm.setString(idx++, entry.getValue());44 }45 pstm.addBatch();46 }47 logger.info("開始執行批量提交");48 pstm.executeBatch();49 conn.commit();50 //等待任務執行成功,調用稽核存過51 logger.info("開始調用存過");
Oracle批量提交