我目前正在尝试为每个开始的游戏创建一个唯一的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;
现在可能出现的问题是,当另一台服务器server2
在id
更新数据库中的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个字符串。
答案 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值要多,但可以正常工作,并且不会给我任何并发错误。