2013-05-08 39 views
0

我想詢問優化這三個查詢的最佳方式。 該功能將被國家項目中的數百萬用戶使用,我希望它儘可能優化(快速)。在一個事務中執行兩個不同的批量查詢和刪除查詢(Java)

請添加任何有用的評論或回答:) 並預先感謝您。

try { 
    //so we don't execute empty batches 
    boolean flag=false; 
    conn = dataSource.getConnection(); 
    autoCommitValue = conn.getAutoCommit(); 
    conn.setAutoCommit(false); 
    stmt = conn.prepareStatement("DELETE FROM table1 WHERE input = ?"); 
    stmt.setLong(1, input); 
    stmt.executeUpdate(); 
    stmt = conn 
      .prepareStatement("INSERT INTO table1 (c1) values (?)"); 

    for (Object Info : Info List) { 
     if (Info .getType() == 0) { 
      flag=true; 
      stmt.setInt(1, Info.getC1()); 
      stmt.addBatch(); 
     } 
    } 
    if(flag){ 
    result = stmt.executeBatch(); 
    flag=false; 
    } 
    stmt = conn.prepareStatement("INSERT INTO table1 (c1,c2,c3) values (?,?,?)"); 

    for (Object Info : Info List) { 
     if (Info .getType() != 0) { 
      flag=true; 
      stmt.setLong(1, input); 
      stmt.setInt(2, Info.getC1()); 
      stmt.setInt(3, resInfo.getC2()); 
      stmt.addBatch(); 
     } 
    } 
    if(flag){ 
    result = stmt.executeBatch(); 
    } 
    conn.commit(); 

} catch (SQLException e) { 
    conn.rollback(); 
    throw new SQLException(); 
} finally { 
    if (conn != null) { 
     // now we return the connection to its original state 
     conn.setAutoCommit(autoCommitValue); 
    } 
    closeDBObjects(conn, stmt); 
} 

回答

2

在嘗試優化代碼之前,我會做的第一件事就是編譯它。下面的幾行不編譯:

for (Object Info : Info List) { 
    if (Info .getType() != 0) { 
    ... 

然後我會尊重了Java命名約定,由若干個這種拆分方法,長使代碼更清潔,並且通過使用更好的名字比flag,例如。

然後我會衡量,測試,看看我有一個性能問題。如果我有一個,我會試着找出它來自哪裏。只有當我確信它來自這種方法(這不太可能),那麼我會嘗試優化它。

讓我們假設這種方法需要優化。我要做的第一件事是確保存在適當的索引,以加速刪除語句。

然後我會避免準備兩個語句,如果該列表是空的。你避免使用flag變量執行它們,但是你不要避免它們的準備。

然後,我會嘗試看看是否使用批處理是必要的,或者如果使用數種類是有用的,這取決於列表的大小,對我的數據庫建議什麼,和什麼測量和測試說。

但正如我所說。做這一切都是過早的優化,這是所有邪惡的根源。嘗試使代碼正確,清潔和維護。

+0

我對代碼的命名和錯誤,我複製我的原代碼,不得不「面具」它真的很抱歉。 我想我會選擇這個作爲我接受的答案,因爲你提到了一些新的東西,這是「不成熟的優化」。 謝謝JB Nizet :) – Faris 2013-05-09 10:00:58