1. 程式人生 > >JDBC addbatch批量處理資料時有最大值限制

JDBC addbatch批量處理資料時有最大值限制

在用jdbc向資料灌入資料時,發現120000的資料每次只能灌入50000多條,其他的就沒有了。 
在oracle 9i(windows 2003),oracle 10g(RHEL 4)上試驗證有相同的結果。 

使用定量灌入的辦法,每5W條定義為一個事務,進行提交,將120000資料迴圈灌入,成功。 
對於批量的update,delete操作兩樣有5W條左右的記錄數限制。 
結論:jdbc批量資料處理的每個批次是有數量的限制的。 
我在本地環境中測試的限制量為每批54464條,其他配置的機器沒有試過。 

以下是插入資料時的程式碼: 

  1. ConnDB cd = new ConnDB();    
  2.         Connection ct = null
    ;    
  3.         PreparedStatement pst = null;    
  4.         ResultSet rs = null;    
  5.         ct = cd.getConn();    
  6.         String insertSql = "insert into mytable (name,age) values(?,?)";    
  7.         System.out.println(insertSql);    
  8.         try {       
  9.             ct.setAutoCommit(false); // 開始事務  
  10.             pst = ct.prepareStatement(insertSql);       
  11.             for (int i = 0; i < 120000; i++) {    
  12.                 pst.setString(1"name" + i);    
  13.                 pst.setInt(2, i);    
  14.                 pst.addBatch();    
  15.                 System.out.println(i);    
  16.                 //分段提交  
  17.                 if((i%50000==0&& i!=0)||i== (120000 -1)){    
  18.                     pst.executeBatch();    
  19.                     ct.commit();    
  20.                     ct.setAutoCommit(false);// 開始事務  
  21.                     pst = ct.prepareStatement(insertSql);    
  22.                     System.out.println("------------>50000");    
  23.                 }    
  24.             }    
  25.             ct.commit();// 提交事務  
  26.         } catch (SQLException e) {    
  27.             try {    
  28.                 ct.rollback();    
  29.             } catch (SQLException e1) {    
  30.                 e1.printStackTrace();    
  31.             }    
  32.             e.printStackTrace();    
  33.         } catch (RuntimeException e) {    
  34.             try {    
  35.                 ct.rollback();    
  36.             } catch (SQLException e1) {    
  37.                 e1.printStackTrace();    
  38.             }    
  39.         } finally {    
  40.           cd.close(ct, pst, rs);    
  41.         }    
  42.     }    

以下是刪除資料時的程式碼: 
  1. ConnDB cd = new ConnDB();    
  2. Connection ct = null;    
  3. PreparedStatement pst = null;    
  4. ResultSet rs = null;    
  5. ct = cd.getConn();    
  6. String deleteSql = "delete from mytable t where t.name=?";    
  7. System.out.println(deleteSql);    
  8. int[] intArray = newint[120000];    
  9. try {    
  10.     ct.setAutoCommit(false); // 開始事務  
  11.     pst = ct.prepareStatement(deleteSql);    
  12.     for (int i = 0; i < 120000; i++) {    
  13.         pst.setString(1"name" + i);    
  14.         pst.addBatch();    
  15.         System.out.println(i);    
  16.         // 分段提交  
  17.         if ((i % 50000 == 0 && i != 0) || i == (120000 - 1)) {    
  18.             intArray = pst.executeBatch();    
  19.             ct.commit();    
  20.             ct.setAutoCommit(false);// 開始事務  
  21.             pst = ct.prepareStatement(deleteSql);    
  22.             System.out.println("------------>50000");    
  23.         }    
  24.     }    
  25.     ct.commit();// 提交事務  
  26. catch (SQLException e) {    
  27.     try {    
  28.         ct.rollback();    
  29.     } catch (SQLException e1) {    
  30.         e1.printStackTrace();    
  31.     }    
  32.     e.printStackTrace();    
  33. catch (RuntimeException e) {    
  34.     try {    
  35.         ct.rollback();    
  36.     } catch (SQLException e1) {    
  37.         e1.printStackTrace();    
  38.     }    
  39. finally {    
  40.     cd.close(ct, pst, rs);    
  41. }    

以下是更新資料的程式碼:
  1. ConnDB cd = new ConnDB();    
  2.         Connection ct = null;    
  3.         PreparedStatement pst = null;    
  4.         ResultSet rs = null;    
  5.         ct = cd.getConn();    
  6.         String deleteSql = "update  mytable t set t.age =20 where t.name=?";    
  7.         System.out.println(deleteSql);    
  8.         int[] intArray = newint[120000];    
  9.         try {    
  10.             ct.setAutoCommit(false); // 開始事務  
  11.             pst = ct.prepareStatement(deleteSql);    
  12.             for (int i = 0; i < 120000; i++) {    
  13.                 pst.setString(1"name"+i);    
  14.                 pst.addBatch();    
  15.                 System.out.println(i);    
  16.                 // 分段提交  
  17.                 if ((i % 50000 == 0 && i != 0) || i == (120000 - 1)) {    
  18.                     intArray = pst.executeBatch();    
  19.                     ct.commit();    
  20.                     ct.setAutoCommit(false);// 開始事務  
  21.                     pst = ct.prepareStatement(deleteSql);    
  22.                     System.out.println("------------>50000");    
  23.                 }    
  24.             }    
  25.             ct.commit();// 提交事務  
  26.         } catch (SQLException e) {    
  27.             try {    
  28.                 ct.rollback();    
  29.             } catch (SQLException e1) {    
  30.                 e1.printStackTrace();    
  31.             }    
  32.             e.printStackTrace();    
  33.         } catch (RuntimeException e) {    
  34.             try {    
  35.                 ct.rollback();    
  36.             } catch (SQLException e1) {    
  37.                 e1.printStackTrace();    
  38.             }    
  39.         } finally {    
  40.             cd.close(ct, pst, rs);    
  41.         }    
  42.     }