有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

MySql中的java多文件更新语句

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

  1. 下载服务器地址
  2. Ping服务器并获取信息
  3. 将信息上传回数据库

到目前为止,我已经能够解决它下载服务器主机名并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语句


共 (4) 个答案

  1. # 1 楼答案

    听起来你想做一个SQL批处理更新。准备好的声明是你的朋友。下面是一个批量使用准备好的语句的示例:

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

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

  2. # 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. # 3 楼答案

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

  4. # 4 楼答案

    如果你在谷歌上搜索“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
    }