2013-02-01 50 views
2

所以我有一個軟件,它基本上從我的MySQL數據庫下載1.5K遊戲服務器地址。然後它將所有這些信息都打包,然後將在線播放器等信息上傳回數據庫。過程是這樣的:java - MySql中的多語句更新語句

  1. 下載服務器地址
  2. 平安的服務器和獲取信息
  3. 上傳信息到數據庫

到目前爲止,我已經能夠解決部分地方它會下載服務器主機名並對其進行處理,但更新服務器時會出現問題。

更新我想過使用for循環來構造一個BIG字符串的許多更新語句,並立即執行它,但這很容易sql注入。所以理想的人會想要使用準備好的語句。

我使用的是SQL update語句是:

UPDATE serverlist SET `onlineplayers` = '3', maxplayers = '10', 
name = 'A game server' WHERE `ip` = 'xxx.xxx.xxx.xxx' AND `port` = 1234; 

所以我的問題是:
我如何可以執行使用參數化查詢所有1.5K更新語句?

回答

3

如果你是谷歌的「jdbc批量更新」,你會得到很多結果like this onethis one

後者有這樣一個例子:

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 
} 
+0

真棒。就是我在找什麼! – Krimson

3

聽起來像你想做一個批處理SQL更新。準備好的陳述是你的朋友。下面是批量使用準備好的語句的一個例子:

http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/

使用預處理語句可以讓設置參數更加容易,並允許DB有效地執行多個更新。執行多個SQL字符串可以工作,但效率很低,因爲每個SQL字符串都將被髮送到DBMS,進行解析,編譯然後執行。使用預處理語句,SQL將被解析並編譯一次,然後再用於未來使用不同參數的更新。

2

創建一份準備好的聲明:

String sql = "update serverlist SET onlineplayers = ?, maxplayers = ?, name = ? where ip = ? and port = ?"; 
PreparedStatement stmt = connection.prepareStatement(sql); 

然後通過你的列表循環,並在每次迭代,做

stmt.setInt(1, onlinePlayers); 
stmt.setInt(2, maxPlayers); 
stmt.setString(3, name); 
stmt.setString(4, ip); 
stmt.setInt(5, port); 
stmt.executeUpdate(); 

爲了獲得更好的性能,您還可以使用批量更新。

閱讀JDBC tutorial

3

,你應該MySQL的批量更新過程中,要注意對另一個重要步驟/插入是JDBC連接propertie rewriteBatchedStatements =真(默認爲false)。沒有它,批處理模式就沒用了。 我花了1天的時間來「修復bug」,直到我發現這一點。 當你有少量的線路和關閉客戶端到數據庫的位置(1ms ping),你甚至不能意識到你在「假批處理模式」,但是當我切換環境到遠程客戶端(ping = 100ms)和100K線更新,將採取「批處理模式更新」的4小時默認rewriteBatchedStatements =假,只是2分鐘與rewriteBatchedStatements =真

+0

你可以在這裏找到類似的細節:http://stackoverflow.com/questions/2993251/jdbc-batch-insert-performance –