Неблокирующие обновления MySQL с помощью Java? - PullRequest
2 голосов
/ 15 мая 2010

Для многопользовательской игры, над которой я работаю, я бы хотел записать события в базу данных mysql, не блокируя поток обновления игры, чтобы, если база данных занята или таблица заблокирована, игра не перестала работать, пока она ждет записи.

Какой лучший способ сделать это?

Я использую c3p0 для управления пулом соединений с базой данных. Моя лучшая идея на данный момент - добавить строки обновления запросов в синхронизированный список с независимым потоком, проверяющим список каждые 100 мс и выполняющим запросы, которые он там находит.

Ответы [ 3 ]

2 голосов
/ 15 мая 2010

Моя лучшая идея на данный момент - добавить строки обновления запроса в синхронизированный список с независимым потоком, проверяющим список каждые 100 мс и выполняющим запросы, которые он там находит.

Это звучит хорошо для меня, если вы не хотите блокировать ваш основной поток, за исключением того, что вы не используете синхронизированный список и опрос 100 мс, а вместо этого используете реализацию BlockingQueue . LinkedBlockingQueue должна выполнить эту работу, если вы сделаете ее неограниченной, она никогда не заблокирует ваш основной поток.

2 голосов
/ 15 мая 2010

Размещать обновления на BlockingQueue. Отдельный поток ожидает в очереди с take(), затем drainTo(), чтобы использовать все ожидающие обновления и отправить их на сервер за один раз. Для максимальной эффективности используйте одну многорядную вставку.

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

0 голосов
/ 04 июля 2010

Я думаю, что «INSERT DELAYED» может быть тем, что вы ищете, поскольку INSERT возвращается немедленно, и MySQL решит все проблемы с потоками за вас. Однако эквивалентного оператора UPDATE не существует, поэтому вам нужно переписать код, чтобы использовать только INSERT или REPLACE.

...