Значение обновления Java SQL при его выборе - PullRequest
0 голосов
/ 28 апреля 2019

В настоящее время я пытаюсь создать уникальный game_id для каждой запускаемой игры.Я пытаюсь сохранить текущий идентификатор в MySQL-таблице game_id с одной строкой id.Я вручную вставил INERT INTO game_id VALUES (0).Теперь простым решением было бы получить текущий id, установить для него текущий идентификатор игры и обновить id в mysql-таблице.Это будет выглядеть примерно так:

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 в базе данных, они оба заканчиваютс точно таким же идентификатором.

Так что мой вопрос, если существует способ ОБНОВИТЬ идентификатор в том же запросе, я выбираю его.

Что-то похожее на следующий простой способ обработки идентификаторов в Java:

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

А если нет, то есть ли другой простой способ сохранить глобальный идентификатор, к которому может получить доступ каждый экземпляр сервера?

//EDIT

UUID был бы идеальным вариантом, если бы пользователям не приходилось запоминать игру, в которую они только что играли.Я хочу привести этот идентификатор к Base36 позже, чтобы я мог показать им текущий gameId вроде 00yq, что означало бы, что идентификатор был 1250.Игрок не сможет запомнить полный UUID, но строка из 4 символов проще.

1 Ответ

0 голосов
/ 30 апреля 2019

Я сделал то, что предложил @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");

Хотя он использует больше памяти, чем одно целочисленное значение, он будет работать нормально и не выдаст мне ошибок параллелизма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...