Oracle批量提交


今天在項目中碰到一個問題,就是需要批量提交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("開始調用存過");

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM