2009-08-17 28 views
2

我有一段代碼在數據庫上執行大約500,000次插入。它現在在一個循環中完成,每次迭代都會調用PreparedStatement的executeUpdate。將所有500,000個插入添加到一個批次並且只調用一次executeBatch會更快嗎?何時更快地在JDBC上使用批處理操作?

+1

「更好」是什麼意思?更簡單?更快?更容易維護?較少使用網絡?發生問題時容易回滾? – 2009-08-17 18:06:51

+1

@ S.Lott:假設「更好」意味着在關於SQL的99%問題中「更快」,這是非常安全的。 – 2009-08-17 18:22:04

+0

@ Bill Karwin:有趣的觀察。你怎麼知道?這個問題真的嗎?你怎麼知道*? – 2009-08-17 18:32:47

回答

3

是的,它會更快。請確保先關閉autoCommit,否則您將無法獲得性能優勢。

4

與(從Sun JDBC doc)批量更新設備產量最有效的結果結合使用PreparedStatement的:

// turn off autocommit 
con.setAutoCommit(false); 

PreparedStatement stmt = con.prepareStatement(
    "INSERT INTO employees VALUES (?, ?)"); 

stmt.setInt(1, 2000); 
stmt.setString(2, "Kelly Kaufmann"); 
stmt.addBatch(); 

stmt.setInt(1, 3000); 
stmt.setString(2, "Bill Barnes"); 
stmt.addBatch(); 

// submit the batch for execution 
int[] updateCounts = stmt.executeBatch(); 
1

500.000是太多,一次加入。記住這些記錄保存在內存中並立即發送。將它們分批加入數千個,我沒有注意到批量(使用MySQL)的1000行和10000行之間有任何改進,但我認爲其他一些因素很重要。

+0

對於準備好的語句的小例子來說,它可能是非常可行的。但它真的取決於,我同意... – topchef 2009-08-17 23:19:25