getResultSet () "должен вызываться только один раз для каждого результата" - PullRequest
6 голосов
/ 03 апреля 2012

В соответствии с документацией для getResultSet в java.sql.Statement написано:

Извлекает текущий результат как объект ResultSet. Этот метод должен вызываться только один раз за результат.

Используя некоторый тестовый код, я запустил executeQuery() и несколько вызовов getResultSet() и заметил, что возвращенный ResultSet указывает на один и тот же объект. Поэтому я предполагаю, что он не возвращает другой ResultSet, который вам нужно было бы закрыть индивидуально. Но, конечно, это может быть уникальным для моих драйверов JDBC.

Глядя на документацию для ResultSet, там написано:

Объект ResultSet по умолчанию не обновляется и имеет курсор, который движется только вперед. Таким образом, вы можете перебирать его только один раз и только от первого до последнего ряда.

Кажется, это хорошая причина, почему не стоит называть его несколько раз, так как это может привести к некоторой ситуации с ошибками. Если бы это была единственная причина, я чувствовал, что они могли бы просто сказать это, поэтому я думаю, что это может быть чем-то большим, чем просто это.

Так кто-нибудь знает, почему нельзя звонить getResultSet более одного раза за результат? Этот вопрос - вот что меня заинтересовало.

1 Ответ

4 голосов
/ 03 апреля 2012

Объект ResultSet - это интерфейс, предоставляемый Java JDBC - они не предоставляют реализацию. Даже если ваш конкретный код базы данных и соответствующие драйверы реализуют ResultSet, так что вы можете вызывать его несколько раз для каждого результата, если вы зависите от такого поведения, которое выходит за рамки контракта, вы, безусловно, играете с огнем.

Одной из возможных причин, по которой контракт был написан с помощью строки this method should be called only once per result, являются соображения эффективности. Построение ResultSet, скорее всего, вызовет JDBC RPC для базы данных, и авторы спецификации JDBC хотели не использовать несколько циклов. Возможно, они не хотели заставить исполнителей эффективно защищать от нескольких вызовов на результат. Опять же, даже если ваша база данных защищает от такого поведения, это не значит, что следующая будет.

Большинство ResultSet реализаций также поддерживают соединение с базой данных открытым, чтобы при получении определенных полей (например, больших двоичных объектов) он мог вызывать базу данных для получения данных. Открывать несколько соединений или (что еще хуже) использовать одно и то же соединение из нескольких объектов ResultSet было бы очень опасно / сбивать с толку.

Кроме того, они могли беспокоиться о том, что две части вашего кода дважды вызывают getResultSet(), и им возвращалась ссылка на один и тот же несинхронизированный объект. Это может вызвать путаницу, когда вызывается next() и объект перезаписывается несколькими ссылками.

Я, конечно, размышляю, но надеюсь, что это поможет.

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