Как я делаю результат SQL-запросов с ОГРАНИЧЕНИЕМ, разным в каждом запросе?

#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