2010-08-08 63 views
5

將1000行插入到一個表(jdbc/connector-mysql數據庫)中的最佳/最省時的方法是什麼? (它是一個緩衝區,每當它已滿時需要轉儲到數據庫中)高效多個SQL插入

1-一個自動生成/連接的SQL語句?

2- for (int i = 0; i<1000; i++) { con.prepareStatement(s.get(i)); } con.commit();

3-存儲過程?

4-批量數據通過文件插入?

5-(您的解決方案)

回答

2

The LOAD DATA INFILE statement可能是您的最佳性能表現。 (上面的選項列表中的#4)雖然它可能需要更多的代碼才能完成您的任務,因爲您需要創建中間文件,將其獲取到服務器,然後調用LOAD DATA將其加載到數據庫中。

MySQL的幫助頁面引用:

的LOAD DATA INFILE語句從一個文本文件 行成 非常高的速度表。

+0

請謹慎使用此方法。我已經看到過去做過這些的系統,創建中間文件並將其發送到服務器的成本已經超過了使用快速文件加載操作的性能優勢。 – 2010-08-09 07:26:40

+0

它看起來非常危險,因爲我們有兩個應用服務器同時訪問同一個數據庫。我真的害怕這個答案出現。 謝謝你的回覆。 – 2010-08-10 12:00:36

0

您可以使用JDBC批量插入。

PreparedStatement ps = cn.prepareStatement("INSERT INTO...."); 

for (int i = 0; i < 1000; i++) { 
    ps.setString(1, "value-" + i); // Set values 
    ps.addBatch();     // Add this to the batch 
    ps.clearParameters();   // Reset the parameters 
} 

ps.executeBatch(); 

但是MySQL的不支持批量插入功能本身,因此要獲得合理的性能,您將需要添加rewriteBatchedStatements=true你的MySQL JDBC配置。

還有一個MySQL特定的批量插入語法,如果您想創建一個大的SQL字符串,您可以使用它。我會嘗試並測試性能。

INSERT INTO x (a,b) 
    VALUES ('1', 'one'), 
      ('2', 'two'), 
      ('3', 'three'); 

請注意兩種方法,因爲您可能會超過單個請求的最大數據包大小。您可能需要設置與緩衝區中的條目數不同的批量大小。例如。您可能需要將10個批次的1000個條目分爲100個。

0

請注意,JDBC在每個語句後自動提交,除非您明確地告訴它不要。這樣做並在運行提交之前運行X插入,應該會提高您的性能。

+0

我忘了寫我正在使用c3p0。所以我必須在最後提交。 – 2010-08-10 21:06:21