2012-07-03 39 views
3

在的addBatch()方法旁邊還有Statement類中的addBatch(String)方法。有關addBatch(字符串)的注意事項

我想處理一系列不同的sql語句,並且正在尋找關於addBatch(String)意味着性能方面的一些說明。使用這種方法是安全的(還是快速),還是將Java中類似的sql語句分組並執行它們會更好?

回答

4

批處理允許您將相關的SQL語句分組到一個批處理中,並通過一次調用將它們提交給數據庫。

當您一次向數據庫發送多個SQL語句時,可以減少通信開銷,從而提高性能。

addBatch(String sql)java.sql.StatementaddBatch()java.sql.PreparedStatement定義的接口定義爲子接口,其extends Statement之一。 (其他是java.sql.CallableStatement

根據JAVA Doc

addbatch(String sql)方法不能在PreparedStatementCallableStatement和SQL叫做 - 通常這是一個SQL INSERTUPDATE聲明。

addBatch()是首選如果您想批量插入或批量更新操作。

上有一批exections幾阻塞因素是

​​

例如:如果你使用MySQL,使用最新的驅動程序添加rewriteBatchedStatements =真到連接字符串,使statement.addBatch ()實際上創建批量插入。

此外,您應該確保自動提交是錯誤的。維護一個計數器,並在該計數器上執行executeBatch,它在Java中的可用堆內存受到約束時提供幫助。

例子:

conn.setAutoCommit(false); 
PreparedStatement pStmt = conn.prepareStatement("INSERT INTO mytable (field1,field2) VALUES (?,?)"); 

for all values: 
    pStmt.setString(1,val1); 
    pStmt.setString(2,val2); 
    pStmt.addBatch();  
    if (i % 1000 == 0) { 
      pstmt.executeBatch();// Execute every 1000 items 
    } 
pstmt.executeBatch(); 
conn.commit(); 
+0

我很害怕,這不是答案,我在尋找。我知道,addBatch()是如何工作的,並且您的語句addBatch(String)不能從PreparedStatement訪問是不正確的。我想知道,addBatch(String)是否提供了任何優勢(performancewise)逐一執行語句。 – Jonathan

+2

@Jonathan:請參閱Java Doc的鏈接「addBatch(String)不能從PreparedStatement訪問是不正確的。」從答案。此外,它寫道,addBatch()具有性能明智的優勢考慮到事實。 –

+0

這個'i'變量來自哪裏?我們可以從聲明中得到它嗎? – sebnukem