我正在尝试在Minecraft Spigot(Bukkit)服务器中发生事件时更新表。由于某种原因,我只是想不通为什么这行不通。无论如何,这些字段根本不会改变。
这是完成工作的代码:
public void processKill(final String killerName, final int killerKS, final String victimName) {
try {
Thread thread = new Thread() {
@Override
public void run() {
try (Connection c = du.makeNewConnection()) {
if (du.testWorkingConnection(c)) {
int best_killstreak = 0;
/* Process killstreak */
PreparedStatement killerKSSQL = c.prepareCall("SELECT best_killstreak FROM `player_data` WHERE name=?");
killerKSSQL.setString(1, killerName);
ResultSet killerKSRS = killerKSSQL.executeQuery();
best_killstreak = (killerKSRS.next()) ? killerKSRS.getInt(1) : 0;
/* Killer stuff */
PreparedStatement killerSQL = c.prepareStatement("UPDATE `player_data` SET kills=kills+1,deaths=deaths,points=points+?,best_killstreak=? WHERE name=?;");
killerSQL.setInt(1, config.getInt("points-per-kill"));
killerSQL.setInt(2, (best_killstreak < killerKS) ? killerKS : best_killstreak);
killerSQL.setString(3, killerName);
killerSQL.execute();
/* Victim stuff */
PreparedStatement victimSQL = c.prepareStatement("UPDATE `player_data` SET kills=kills,deaths=deaths+1,points=points-?,best_killstreak=best_killstreak WHERE name=?;");
victimSQL.setInt(1, config.getInt("minus-points-per-death"));
victimSQL.setString(2, victimName);
victimSQL.execute();
}
} catch (SQLException e) {
e.printStackTrace(System.err);
return;
}
}
};
thread.start();
thread.join();
} catch (InterruptedException e) {
e.printStackTrace(System.err);
}
}
显然我做错了什么,但我只是不知道该怎么办。通常,我可以弄清楚如何在Web开发中执行类似的操作,但这使我无法胜任。
如果您需要任何其他信息,我很乐意为您服务。现在,有谁能看到关于为什么这种方法不起作用的任何严重错误?
谢谢。
最佳答案
使用executeUpdate
而不是execute
来运行更新查询。尽管execute API文档指出它应适用于udpates,但并非在大多数情况下都适用。
这是您需要更改的
从
killerSQL.execute();
至
killerSQL.executeUpdate();
类似的另一个。
还承诺添加关闭您的结果集,语句和连接。