Мне нужно Java-приложение, которое должно управлять базой данных для распределения рабочих единиц своим клиентам. По сути, это грид-приложение: база данных заполняется входными параметрами для клиентов, и все ее кортежи должны быть распределены по запросам клиентов. После того, как клиенты отправят свои результаты, сервер соответствующим образом модифицирует базу данных (например, пометит вычисленные кортежи).
Теперь давайте предположим, что у меня есть база данных (SQLite или MySQL), заполненная кортежами, и что клиенты выполняют запрос для группы входные кортежи: я хочу, чтобы группа рабочих единиц отправлялась исключительно уникальному клиенту, поэтому мне нужно пометить их как «уже запрошенные другим клиентом». Если я запрашиваю базу данных для первых (например, 5) запросов, а тем временем другой клиент делает тот же запрос (в многопоточной серверной архитектуре и без какой-либо синхронизации), я думаю, что есть вероятность, что оба клиента получат одни и те же рабочие единицы. .
Я предположил, что решения могут быть следующими:
1) создать однопоточную серверную архитектуру (ServerSocket.accept() вызывается снова только после того, как предыдущий клиентский запрос был обслужен, так что доступ к серверу может быть осуществлен только клиентом в время)
2) в многопоточной архитектуре синхронизируйте операции запросов и блокировок кортежей, чтобы получить своего рода атомарность (эффективно сериализующие операции над базой данных)
3) использовать атомарные операции запросов для сервер базы данных (или файл, в случае SQLite), но в этом случае мне нужна помощь, потому что я не знаю, как обстоят дела на самом деле...
Однако я надеюсь, что вы поняли мою проблему: это очень похоже на seti@home, который распределяет свои рабочие единицы, но пересечение всех распределенных единиц для множества клиентов равно нулю (теоретически). Мои нефункциональные потребности заключаются в том, что язык — java, а база данных — SQLite или MySQL.