MySql中的java多文件更新语句

MySql中的java多文件更新语句,java,mysql,jdbc,sql-update,sql-parametrized-query,Java,Mysql,Jdbc,Sql Update,Sql Parametrized Query,所以我有一个软件,基本上从我的MySQL数据库下载1.5K游戏服务器地址。然后它会ping所有这些数据,然后将诸如在线播放器之类的信息上传回数据库。过程如下所示: try { ... connection con.setAutoCommit(false); PreparedStatement prepStmt = con.prepareStatement( "UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?

所以我有一个软件,基本上从我的MySQL数据库下载1.5K游戏服务器地址。然后它会ping所有这些数据,然后将诸如在线播放器之类的信息上传回数据库。过程如下所示:

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
} 
  • 下载服务器地址
  • Ping服务器并获取信息
  • 将信息上传回数据库
  • 到目前为止,我已经能够解决它下载服务器主机名并ping它们的部分,但问题出现在更新服务器时

    为了更新,我考虑使用for循环构造一个由许多update语句组成的大字符串,并立即执行它,但这很容易导致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 updates语句?

    听起来像是要执行SQL批处理更新。准备好的陈述是你的朋友。下面是一个在批处理中使用准备好的语句的示例:

    使用准备好的语句可以更轻松地设置参数,并允许DB高效地执行多个更新。执行多个SQL字符串可以工作,但效率很低,因为每个SQL字符串都会被发送到DBMS、解析、编译,然后执行。使用准备好的语句,SQL将被解析和编译一次,然后使用不同的参数重新用于将来的更新。

    如果您搜索“jdbc批量更新”,您将获得大量结果或结果

    后者有这样一个例子:

    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
    } 
    
    试试看{
    ...
    连接con.setAutoCommit(假);
    PreparedStatement prepsmt=con.PreparedStatement(
    “更新部门设置管理器编号=?其中部门编号=?”;
    预备设置管柱(1,经理M1);
    预安装管柱(2,部门1);
    prepsmt.addBatch();
    预安装管柱(1个,经理m2);
    预安装管柱(2,部门2);
    prepsmt.addBatch();
    int[]numUpdates=prepsmt.executeBatch();
    对于(int i=0;i
    创建准备好的语句:

    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();
    
    为了获得更好的性能,还可以使用批处理更新


    阅读。

    在MySQL批量更新/插入过程中,您应该注意的另一个重要步骤是JDBC连接属性rewriteBatchedStatements=true(默认情况下为false)。没有它,批处理模式是无用的。 我花了一天的时间来“修复bug”,直到我发现这一点。
    当你有少量的线路并且将客户端关闭到DB位置(1ms ping)时,你甚至无法意识到你处于“假批处理模式”,但当我将环境切换到远程客户端(ping=100ms)和100k线路进行更新时,需要4小时的“批处理模式更新”默认情况下,rewriteBatchedStatements=false,只有2分钟时间,rewriteBatchedStatements=true

    。这正是我要找的!您可以在此处找到类似的详细信息: