簡體   English   中英

在批處理中使用JDBC preparedStatement

[英]using JDBC preparedStatement in a batch

我使用Statement的批處理來查詢我的數據庫。 Iv'e現在做了一些研究,我想重寫我的應用程序使用preparedStatement代替,但我有很難搞清楚如何查詢添加到preparedStatement批。

這就是我現在正在做的事情:

private void addToBatch(String sql) throws SQLException{
sttmnt.addBatch(sql);
batchSize++;
if (batchSize == elementsPerExecute){
    executeBatches();
}
}

其中sttmntStatement類型的類成員。

我想要做的是使用preparedStatementsetString(int, String)方法設置一些動態數據,然后將其添加到批處理中。

不幸的是,我不完全理解它是如何工作的,以及如何將setString(int, String)用於批處理中的特定sql,或者為我擁有的每個sql創建一個新的preparedStatemnt ,然后將它們全部連接到一個批處理。

有可能這樣做嗎? 或者我是否真的錯過了對preparedStatement理解?

有關示例,請閱讀本文檔的6.1.2節 基本上,您使用相同的語句對象,並在設置所有占位符后調用批處理方法。 另一個適用於任何JDBC實現的IBM DB2示例 從第二個網站:

try {
  connection con.setAutoCommit(false);        
  PreparedStatement prepStmt = con.prepareStatement(    
    "UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
  prepStmt.setString(1,mgrnum1);            
  prepStmt.setString(2,deptnum1);
  prepStmt.addBatch();                      

  prepStmt.setString(1,mgrnum2);                        
  prepStmt.setString(2,deptnum2);
  prepStmt.addBatch();
  int [] numUpdates=prepStmt.executeBatch();
  for (int i=0; i < numUpdates.length; i++) {
    if (numUpdates[i] == -2)
      System.out.println("Execution " + i + 
        ": unknown number of rows updated");
    else
      System.out.println("Execution " + i + 
        "successful: " + numUpdates[i] + " rows updated");
  }
  con.commit();
} catch(BatchUpdateException b) {
  // process BatchUpdateException
} 

例如,使用PreparedStatement ,您可以使用通配符

Sring query = "INSERT INTO users (id, user_name, password) VALUES(?,?,?)";
PreparedStatement statement = connection.preparedStatement(query);
for(User user: userList){
    statement.setString(1, user.getId()); //1 is the first ? (1 based counting)
    statement.setString(2, user.getUserName());
    statement.setString(3, user.getPassword()); 
    statement.addBatch();
}

這將使用上面顯示的查詢創建1個PreparedStatement 。當您要插入或任何您想要的內容時,您可以遍歷列表。 如果你想執行你,

statement.executeBatch();
statement.clearBatch(); //If you want to add more, 
//(so you don't do the same thing twice)

我在這里專門為MySQL添加了一個額外的答案。

我發現進行一批插入的時間類似於單個插入的時間長度,即使是批處理周圍的單個事務也是如此。

我將參數rewriteBatchedStatements=true添加到我的jdbc網址,並看到了一個顯着的改進 - 在我的情況下,一批200個插入從125毫秒。 沒有參數約10至15毫秒。 用參數。

請參閱使用rewriteBatchedStatements = true的MySQL和JDBC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM