Порядок строк в константе ResultSet для того же запроса SQL через JDBC в том же состоянии данных БД? - PullRequest
0 голосов
/ 16 января 2019

Попытка написать задание, которое выполняет SQL-запрос в Java с использованием драйверов JDBC (поставщиками БД могут быть Oracle, DB2 или Postgres). Запрос не имеет большого значения. Допустим, он фильтрует определенные значения в нескольких столбцах в таблице 1 БД, и в результате получается несколько тысяч строк.

Для каждой строки в ResultSet мне нужно выполнить некоторую логику, а иногда это может дать сбой.

У меня есть позиция курсора, поэтому я «запоминаю» последнюю успешно обработанную позицию строки.

Теперь я хочу реализовать функцию «Возобновить» в случае сбоя, чтобы не обрабатывать заново весь ResultSet.

Я пошел в спецификацию JDBC Java 8 и не нашел ничего о порядке строк (одинаково ли для одного и того же запроса к тем же данным или нет)? Также не удалось найти что-либо в спецификации поставщиков БД.

Кто-нибудь, кто мог бы намекнуть, где искать ответ о предсказуемости порядка строк?

1 Ответ

0 голосов
/ 16 января 2019

Вы можете гарантировать порядок строк, включив предложение ORDER BY, которое включает в себя все столбцы, необходимые для уникальной идентификации строки. Фактически, это only способ гарантировать порядок от повторных вызовов оператора SELECT, даже если в базе данных ничего не изменилось. Без однозначного предложения ORDER BY ядро ​​базы данных может свободно возвращать строки в любом удобном для них порядке в данный момент.

Рассмотрим простой пример:

Вы являетесь единственным пользователем базы данных. Механизм базы данных имеет кэш строк в памяти, который может содержать последние 1000 найденных строк. Сервер базы данных был только что перезапущен, поэтому кеш пуст. Вы SELECT * FROM tablename и ядро ​​базы данных извлекают 2000 строк, последние 1000 из которых остаются в кэше. Тогда вы делаете SELECT * FROM tablename снова. Механизм базы данных проверяет кэш и находит 1000 строк из предыдущего запроса, поэтому он немедленно возвращает их, потому что при этом ему больше не придется нажимать на диск. Затем он приступает к поиску других 1000 строк. Конечным результатом является то, что 1000 строк, которые были возвращены last для начального SELECT, фактически возвращаются first для последующего SELECT.

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