#java #sql #postgresql #locking
#java — язык #sql #postgresql #запирание #java #блокировка
Вопрос:
У меня есть следующий SQL:
SELECT id, url
FROM link
WHERE visited = false
ORDER BY id
LIMIT 500;
—* 500 — это только пример
Я создаю webcrawler, и там есть таблица со ссылками. Этот SQL возвращает ссылки для посещения, но не все, а только количество, определенное в предложении limit.
Я буду использовать потоки, и если первый поток выполнит этот запрос, он получит первые 500 ссылок, если второй поток выполнит тот же запрос, он получит следующие 500 ссылок. Другими словами, первый поток получает ссылки от 1 до 500, второй поток получает от 501 до 1000, третий поток получает от 1001 до 1500 и так далее.
ВОЗМОЖНО, это не обязательно работает с потоками, но с разными компьютерами, на которых запущено одно и то же приложение. Я не знаю, нужно ли создавать поле в таблице, чтобы установить, что строка использовалась другим потоком / приложением, или я могу сделать это только с помощью SQL / СУБД. Я использую PostgreSQL.
Другими словами, мне снова нужно заблокировать строку, к которой обращаются, чтобы она не отображалась в другом запросе.
Комментарии:
1. Смещение или поле, что лучше? Другое решение?
Ответ №1:
Вы пробовали обновить / вернуть?
update link
set visiting = true
from (
select id
from link
where visiting = false
and visited = false
limit 500
for update
) as batch
where batch.id = link.id
returning *;
Комментарии:
1. Теперь я думаю, что это лучший способ. Спасибо: D
Ответ №2:
Пропустите 1500 строк и возьмите следующие 500
SELECT id, url
FROM link
WHERE visited = false
ORDER BY id
LIMIT 500 OFFSET 1500
http://www.postgresql.org/docs/8.3/interactive/queries-limit.html