2011-10-12 32 views
1

我想弄清楚讓MySQL使用批量更新的最佳方法。在MySQL中使用批量SQL命令JDBC

我創建了10000條記錄。每個記錄必須插入到數據庫,像這樣:

for 1 to 10000 
1) insert into table1 
2) get auto increment id from table1 (call it table1ID) 
3) use table1ID to insert into table2 
next 

我沒有看到一個簡單的方法來批次的場景。也許批次table1插入10,000次,然後獲取所有表ID,然後再批量10,000個插入到table2。但是,我需要確保所有的插入符合。對於table1中的每個插入,我需要將table2正確插入。

回答

1

無法批量插入行並取回相應的ID(來自自動增量列)。你必須逐個循環插入,將所有ID存儲在列表中,然後批量插入/更新/無論表2.

在你的例子中,這是10000 + 1的數據庫操作,它與20,000次操作相比,情況有了很大改善。

+0

「無法批量插入行並取回相應的ID」=>這是完全錯誤的。看到我自己的答案。 –

+0

我明白你的解決方案如何適用於父母/子女關係,但是如果你想爲每個100個「孩子」插入100個「父母」,你會怎麼做? – michael667

+0

插入一個父親,獲取其ID,插入100個孩子。做這100次。 –

1

這裏是我如何做到這一點的一個非常大的SQL批處理文件的示例:

  • 我先插入一個值,不帶父
  • 我記得上次插入ID
  • 我用它插入子類別,以及精確idparent作爲最後插入的ID。

這是非常接近你想要做什麼:

insert into category (idparent,description) values (NULL, 'Mycat'); 
set @lt=LAST_INSERT_ID(); 
insert into category (idparent,description) values 
    (@lt, 'MySubCat'), 
    (@lt, 'MyOtherSubCat'); 

希望這有助於。

0

您可以使用以下方法...使用前請先進行測試,因爲語句中的getGeneratedKeys()取決於所使用的驅動程序。以下代碼在Maria DB 10.0.12和Maria JDBC驅動程序1.2 上進行了測試。Maria DB 10構建於MySQL 5.6之上,因此它也可以與MySQL一起使用。

請記住,增加批量大小隻會在一定程度上提高性能......對於我的設置,將批量增加到500以上實際上會降低性能。

public Connection getConnection(boolean autoCommit) throws SQLException { 
    Connection conn = dataSource.getConnection(); 
    conn.setAutoCommit(autoCommit); 
    return conn; 
} 

private void testBatchInsert(int count, int maxBatchSize) { 
    String querySql = "insert into batch_test(keyword) values(?)"; 
    try { 
     Connection connection = getConnection(false); 
     PreparedStatement pstmt = null; 
     ResultSet rs = null; 
     boolean success = true; 
     int[] executeResult = null; 
     try { 
      pstmt = connection.prepareStatement(querySql, Statement.RETURN_GENERATED_KEYS); 
      for (int i = 0; i < count; i++) { 
       pstmt.setString(1, UUID.randomUUID().toString()); 
       pstmt.addBatch(); 
       if ((i + 1) % maxBatchSize == 0 || (i + 1) == count) { 
        executeResult = pstmt.executeBatch(); 
       } 
      } 
      ResultSet ids = pstmt.getGeneratedKeys(); 
      for (int i = 0; i < executeResult.length; i++) { 
       ids.next(); 
       if (executeResult[i] == 1) { 
        System.out.println("Execute Result: " + i + ", Update Count: " + executeResult[i] + ", id: " 
          + ids.getLong(1)); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      success = false; 
     } finally { 
      if (rs != null) { 
       rs.close(); 
      } 
      if (pstmt != null) { 
       pstmt.close(); 
      } 
      if (connection != null) { 
       if (success) { 
        connection.commit(); 
       } else { 
        connection.rollback(); 
       } 
       connection.close(); 
      } 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
}