Java-сервер. Многопоточный доступ к MySQL. Как управлять несколькими запросами? - PullRequest
1 голос
/ 17 февраля 2012

В настоящее время я планирую Java-сервер, на котором запущен пул потоков, который принимает клиентские подключения, для которых требуется чтение / обновление базы данных.

Как насчет случая множественного чтения / записи наодин ряд?Как мне это сделать?Должен ли я создать очередь на Java или MySQL может обрабатывать такие вещи?

Например, я планирую использовать транзакции, в которых я буду использовать следующее для блокировки строки:

Select <columns> from <table> where <condition> FOR UPDATE;

Вопрос:Что если другой поток заходит и хочет обновить ту же строку перед первым коммитом?Сбой запроса или MySQL будет некоторое время удерживать его и ждать, пока будет снята первая блокировка?

Мое текущее решение: я думаю, что одним из способов сделать это может быть создание статической очереди / каналаиз всех запросов, так что только один подается к БД одновременно.Это, очевидно, узкое место и вообще плохая идея?

Кроме того, существуют ли какие-либо Java-фреймворки, которые обрабатывают такие вещи и соединения MySQL в целом?Спасибо.

РЕДАКТИРОВАТЬ: я планирую использовать пул потоков, поэтому все запросы будут поступать из отдельных соединений.

Ответы [ 2 ]

4 голосов
/ 17 февраля 2012

Вам не нужно беспокоиться о том, что несколько потоков читают или пишут в одной строке.MySQL позаботится об этом за вас.В зависимости от движка стола, он будет делать это по-разному, но всегда будет делать это.Если у вас есть контроль над таблицами, я рекомендую использовать движок InnoDB, поскольку он использует блокировку на уровне строк.Таким образом, он будет обрабатывать гораздо больший трафик.Однако (обычная) альтернатива (MyISAM) не поддерживает блокировку на уровне строк, она использует блокировку таблицы.

Надеюсь, это поможет.

PS:

Что если другой поток заходит и хочет обновить ту же строку до первой фиксации?

MySQL сохраняет все UPDATE s и INSERT s в пуле буферов.Когда пул становится достаточно большим (или после определенного времени ожидания), буфер сбрасывается в таблицы.Если SELECT выполняется до этого сброса, то MySQL будет считывать информацию как из буфера, так и из таблиц, чтобы предоставить точную информацию. Исключение составляют: незафиксированные транзакции.

0 голосов
/ 17 февраля 2012

Прежде всего: СУБД в течение многих десятилетий обрабатывал параллельный доступ :) MySQL будет правильно управлять этим для вас, чтобы вам не приходилось ставить запросы в очередь. Однако существуют различные уровни параллелизма (изоляции), которые вы можете установить через JDBC.

http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html#setTransactionIsolation(int)

Большой вопрос в параллелизме записей - это не столько соответствующая семантика, сколько уведомление на уровне пользователя, если данные грязные. НО, если вам просто нужно обеспечить надлежащий последовательный доступ к записи (строке), почти любая БД справится с этим прекрасно.

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