Поведение ResultSet после повреждения соединения - PullRequest
1 голос
/ 04 июня 2009

Предположим, я выполняю вызов JDBC и извлек данные из базы данных в ResultSet. Но из-за проблем с сетью я потерял связь с базой данных.

(Connection, Statement и ResultSet не закрыты в БД). Смогу ли я перебрать ResultSet?

Ответы [ 3 ]

4 голосов
/ 02 апреля 2010

Даже если бы вы могли, вы не должны, если вы не программируете против очень специфического драйвера jdbc. В некоторых случаях набор результатов не будет создаваться вообще. В других (Oracle IIRC) вы можете настроить его так, чтобы он выбирал только определенное количество строк из общего числа.

Однако, в общем, если вы потеряете соединение, у вас есть больше поводов для беспокойства, чем вопрос, можете ли вы перебрать частично извлеченный объект набора результатов. В таких случаях эмпирическое правило составляет

  1. предположить худшее;
  2. попытка закрыть набор результатов, заявление и связь; даже если физическое соединение потеряно, там могут быть ресурсы, такие как память и файловые дескрипторы на вызывающей стороне которые должны быть утилизированы;
  3. если возможно, попытайтесь получить новый соединение (либо новое физическое один или из пула соединений) и начать заново.

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

В некоторых редких случаях БД может отправить вам код, специфичный для поставщика ( SQLException.getErrorCode () ), который может указать, можно ли повторить операцию. У Oracle есть некоторые конкретные коды (не запоминайте их) для случаев, когда вы делаете вставку, и уникальное ограничение было нарушено. Иногда такие неудачные операции можно повторить, но это зависит от поставщика и бизнеса.

В общем, просто сбросьте набор результатов поиска и начните сначала.

3 голосов
/ 04 июня 2009

Я почти уверен, что это полностью зависит от того, как ваш драйвер JDBC справится с этим. Возможно, он буферизовал все результаты до потери соединения. Возможно, он только буферизовал следующие 10 результатов, прежде чем соединение было потеряно. Даже если все результаты были буферизованы, сам драйвер может начать выдавать исключения, прежде чем вы сможете закончить итерацию по буферизованным результатам.

Лично я бы предположил, что любое поведение после прерывания сети считается неопределенным.

1 голос
/ 05 июня 2009

Как правило, любой тип объекта «полный набор результатов» не будет построен полностью, пока полный набор строк не будет получен успешно. Если, например, у вас есть свойство типа NumberRecordsAffect на объект, то оно должно получить все строки.

Однако перечисляемый объект, такой как GetFirstRow / GetNextRow, обычно будет сбрасывать порцию строк за раз, поэтому вы не узнаете, что соединение прервалось, пока текущий буфер не был исчерпан (если он буферизует какие-либо строки), и он пытается извлечь следующий ряд из БД.

В любом случае я ожидаю, что будет сгенерировано исключение, но IANAJDBCD (я не являюсь разработчиком jdbc).

...