MySql中的java多文件更新语句
所以我有一个软件,基本上可以从我的MySQL数据库下载1.5K游戏服务器地址。然后,它会ping所有这些数据,然后将在线播放器等信息上传回数据库。过程如下所示:
- 下载服务器地址
- 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语句
# 1 楼答案
听起来你想做一个SQL批处理更新。准备好的声明是你的朋友。下面是一个批量使用准备好的语句的示例:
http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/
使用预先准备好的语句可以更轻松地设置参数,并允许数据库高效地执行多个更新。执行多个SQL字符串可以工作,但效率很低,因为每个SQL字符串都会被发送到DBMS,经过解析、编译,然后执行。使用准备好的语句,SQL被解析和编译一次,然后使用不同的参数重新用于未来的更新
# 2 楼答案
创建一份准备好的声明:
然后循环浏览你的列表,在每次迭代中
为了获得更好的性能,还可以使用批量更新
阅读JDBC tutorial
# 3 楼答案
在MySQL批量更新/插入期间,您应该注意的另一个重要步骤是JDBC连接属性rewriteBatchedStatements=true(默认情况下为false)。没有它,批处理模式毫无用处。 我花了一天时间“修复bug”,直到我发现了这个。 当你有少量的线路并且将客户端关闭到DB位置(1ms ping)时,你甚至无法意识到你处于“假批处理模式”,但当我将环境切换到远程客户端(ping=100ms)和100k线路进行更新时,默认情况下,需要4小时的“批处理模式更新”rewriteBatchedStatements=false,只有2分钟的时间rewriteBatchedStatements=true
# 4 楼答案
如果你在谷歌上搜索“jdbc批量更新”,你会得到很多结果like this one或this one
后者有这样一个例子: