今天在項目中碰到一個問題,就是需要批量提交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 //第一個參數是UID 28 pstm.setString(1, uid); 29 // 第2個參數是TASK_ID 30 pstm.setInt(2, taskInfo.getPlanId()); 31 // 第3個參數是BATCH_NO 32 Date batchNO = new Date(format.parse(receiveTask.getTaskStartTime()).getTime()); 33 System.out.println(batchNO); 34 pstm.setDate(3, batchNO); 35 //第4個參數是CollectID 36 pstm.setLong(4,Long.valueOf(auditObject.getAuditObjectId())); 37 // 第5個參數是TARGET_DB 38 pstm.setString(5, auditObject.getTargetDb()); 39 // 第8個參數是AUDIT_TIMES 40 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("開始調用存過");
