MySql中的java多文件更新语句
所以我有一个软件,基本上从我的MySQL数据库下载1.5K游戏服务器地址。然后它会ping所有这些数据,然后将诸如在线播放器之类的信息上传回数据库。过程如下所示: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=?
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
}
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。这正是我要找的!您可以在此处找到类似的详细信息: