2

したがって、基本的にMySQL dbから1.5Kのゲームサーバーアドレスをダウンロードするソフトウェアがあります。次に、それらすべてに ping を送信し、オンライン プレーヤーなどの情報をデータベースにアップロードします。プロセスは次のようになります。

  1. ダウンロードサーバーアドレス
  2. サーバーに ping を実行して情報を取得する
  3. 情報をデータベースにアップロードする

これまでのところ、サーバーのホスト名をダウンロードしてpingを実行する部分を解決できましたが、サーバーの更新時に問題が発生します。

更新するには、for ループを使用して多くの更新ステートメントの 1 つの大きな文字列を作成し、一度に実行することを考えましたが、これは sql インジェクションを起こしやすいです。したがって、理想的には、準備済みステートメントを使用したいと思うでしょう。

私が使用しているSQL更新ステートメントは次のとおりです。

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

私の質問は次
のとおりです。パラメーター化されたクエリを使用して、1.5K の更新ステートメントをすべて実行するにはどうすればよいですか?

4

4 に答える 4

4

「jdbc bulk update」をグーグルで検索すると、これやこのような結果がたくさん得られます。

後者には、次のような例があります。

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
} 
于 2013-02-01T17:01:49.940 に答える
3

SQLのバッチ更新を実行したいようです。プリペアドステートメントはあなたの友達です。プリペアドステートメントをバッチで使用する例を次に示します。

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

プリペアドステートメントを使用すると、パラメーターの設定が容易になり、DBが複数の更新を効率的に実行できるようになります。複数のSQL文字列の実行は機能しますが、各SQL文字列がDBMSに送信され、解析され、コンパイルされてから実行されるため、非効率的です。プリペアドステートメントを使用すると、SQLは一度解析およびコンパイルされ、その後、さまざまなパラメータを使用して将来の更新に再利用されます。

于 2013-02-01T16:59:33.270 に答える
3

MySQL バッチ更新 / 挿入中に注意する必要があるもう 1 つの重要なステップは、JDBC 接続プロパティrewriteBatchedStatements=true (デフォルトでは false ) です。それがなければ、バッチモードは役に立ちません。これがわかるまで、「バグを修正」するのに1日かかりました。回線数が少なく、クライアントからDBへの場所が近い場合(1ms ping)、「偽のバッチモード」であることさえ認識できませんが、環境をリモートクライアントに切り替えると(ping = 100ms)、100k行を更新すると、デフォルトの rewriteBatchedStatements=falseで「バッチ モード更新」に4 時間かかり、 rewriteBatchedStatements=trueでわずか 2分かかります。

于 2016-10-28T15:37:43.550 に答える
1

準備済みステートメントを作成します。

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 チュートリアルを読んでください。

于 2013-02-01T17:02:51.087 に答える