Перевод монет между игроками

Версия Minecraft
1.7.10
API
Forge
12
1
0
Всем привет. Создаю мод для экономики на сервере. Мне нужно реализовать перевод монет между игроками. Как лучше это сделать? Не подключаться же к базе данных при каждой отправке пакета? Хотел создать массив для транзакций и постепенно выполнять переводы, но, возможно, есть вариант получше. Заранее спасибо!
 
Решение
Размещайте базу данных на той же машине что и сервер. Тогда ни задержек, ни отвалов из-за сети не будет.
Чтобы не вызывать лаги в игре, операции с базой данных надо выполнять асинхронно. С экономикой это не проблема, взаимодействия с миром нет.
Смотри в тему пулов подключений. Ну и да, операции в базе можно выполнять батчами, а не последовательно - оно должно работать быстрее тогда.
---
Ну и мб я ошибаюсь, но 1 перевод денег между игроками это же 1 транзакция? Из 3-4 операций, причём не самых трудных? Если у тебя не 1.5к игроков сделают одновременный перевод всё должно быть ок, не?
 
Я подумал, что сохранять транзакции в массиве не очень правильно из-за того что при краше или рестарте сервера несколько транзакций может не пройти.
А если каждый раз подключаться к бд, то, когда игрок спамит переводами, они будут происходить с задержкой, по крайней мере у меня так, хочу чтобы они происходили почти моментально.

Спасибо за ответ, буду изучать
 
Размещайте базу данных на той же машине что и сервер. Тогда ни задержек, ни отвалов из-за сети не будет.
Чтобы не вызывать лаги в игре, операции с базой данных надо выполнять асинхронно. С экономикой это не проблема, взаимодействия с миром нет.
 
Еще один вопрос по теме. Как составить SQL-запрос для перевода?
Составил такой запрос:
START TRANSACTION;UPDATE users SET money = money - ? WHERE username = ?;UPDATE users SET money = money + ? WHERE username = ?;COMMIT;
Выдает ошибку:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE users SET money = money - 100 WHERE username = 'iLol';UPDATE users SET mo' at line 1
 
Со стороны Java не нужно вызывать Start и Commit транзакции, это делается средствами JDBC. И неплохо в целом узнать что ты делаешь со стороны кода, ибо в твоей транзакции одновременно происходит и сложение и вычитание баланса, явно бред же.
 
Еще один вопрос по теме. Как составить SQL-запрос для перевода?
Составил такой запрос:
START TRANSACTION;UPDATE users SET money = money - ? WHERE username = ?;UPDATE users SET money = money + ? WHERE username = ?;COMMIT;
Выдает ошибку:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE users SET money = money - 100 WHERE username = 'iLol';UPDATE users SET mo' at line 1
Транзакции необязательно в 1 строку писать. Собственно, потому они и транзакции.
 
Есть ещё что улучшить:
1. Select запрос на проверку баланса тоже нужно проводить внутри транзакции с добавлением for update чтобы временно заблокировать запись для других операций «состояние гонки». Какой-нибудь сайт должен делать то же самое.
2. Следует использовать UUID для хранения данных игроков. Никнеймы могут меняться и нужны только для людей.
 
Назад
Сверху