选择Java SQL更新值

时间:2019-04-28 14:11:02

标签: java mysql concurrency

我目前正在尝试为每个开始的游戏创建一个唯一的game_id。我尝试将当前ID存储在MySQL表game_id中,并带有一行id。我手动插入了INERT INTO game_id VALUES (0)。现在,一种简单的解决方案是获取当前的id,将其设置为当前的游戏ID,并更新mysql表上的id。这看起来像这样:

Statement st = c.createStatement();
ResultSet res = st.executeQuery("SELECT `id` FROM `game_id` WHERE 1;");
if (!res.next()) {
    st.close();
    return -1;
}
int id = res.getInt("id");
st.executeUpdate("UPDATE `game_id` SET `id`=`id`+1 WHERE 1;");
st.close();
return id;

现在可能出现的问题是,当另一台服务器server2id更新数据库中的server1之前获得id时,它们最终都完全相同ID。

所以我的问题是在我选择它的同一查询中是否存在一种更新ID的方法。

类似于以下在Java中处理id的简单方法:

static int IDS = 0;
int id = IDS++;

如果没有,还有另一种简单的方法来存储服务器的每个实例都可以访问的全局ID?

//EDIT

如果用户不必记住他们刚玩过的gameId,那么UUID会很好。我想稍后将此ID转换为Base36,以便向他们显示当前的gameId,例如00yq,这意味着ID为1250。玩家将无法记住完整的UUID,但更容易记住4个字符串。

1 个答案:

答案 0 :(得分:0)

我现在按照@LutzHorn的建议去做。

UUID u = UUID.randomUUID();
Statement st = MySQL.createStatement();
st.executeUpdate("INSERT INTO `game_info` (`uuid`) VALUES ('" + u.toString() + "'");");
ResultSet res = st.executeQuery("SELECT `id_int` FROM `game_info` WHERE `uuid`='" + u.toString() + "';");
res.next();
int id = res.getInt("id_int");

虽然它使用的内存比单个Integer值要多,但可以正常工作,并且不会给我任何并发错误。