Объект ResultSet
- это интерфейс, предоставляемый Java JDBC - они не предоставляют реализацию. Даже если ваш конкретный код базы данных и соответствующие драйверы реализуют ResultSet
, так что вы можете вызывать его несколько раз для каждого результата, если вы зависите от такого поведения, которое выходит за рамки контракта, вы, безусловно, играете с огнем.
Одной из возможных причин, по которой контракт был написан с помощью строки this method should be called only once per result
, являются соображения эффективности. Построение ResultSet, скорее всего, вызовет JDBC RPC для базы данных, и авторы спецификации JDBC хотели не использовать несколько циклов. Возможно, они не хотели заставить исполнителей эффективно защищать от нескольких вызовов на результат. Опять же, даже если ваша база данных защищает от такого поведения, это не значит, что следующая будет.
Большинство ResultSet
реализаций также поддерживают соединение с базой данных открытым, чтобы при получении определенных полей (например, больших двоичных объектов) он мог вызывать базу данных для получения данных. Открывать несколько соединений или (что еще хуже) использовать одно и то же соединение из нескольких объектов ResultSet
было бы очень опасно / сбивать с толку.
Кроме того, они могли беспокоиться о том, что две части вашего кода дважды вызывают getResultSet()
, и им возвращалась ссылка на один и тот же несинхронизированный объект. Это может вызвать путаницу, когда вызывается next()
и объект перезаписывается несколькими ссылками.
Я, конечно, размышляю, но надеюсь, что это поможет.