java.sql.ResultSet: недостатки дизайна? - PullRequest
1 голос
/ 14 сентября 2011

Это сигнатура java.sql.ResultSet.next():

public boolean next() throws SQLException

Как вы все знаете, метод возвращает true, если в ResultSet доступно больше строк.Но что, если SQLException брошен?Я не могу получить возвращаемое значение next(), поэтому я не могу узнать, доступно ли больше записей (в интерфейсе нет следа hasNext метода).

Давайтепереключить перспективу.Я работаю над драйвером JDBC, который должен быть отказоустойчивым (он читает из csv).Как я могу сообщить своим пользователям, если после неправильной строки доступно больше строк?

Ответы [ 5 ]

2 голосов
/ 14 сентября 2011

В этом дизайне API нет ничего плохого.next() - Перемещает курсор на одну строку от его текущей позиции.Таким образом, драйвер JDBC имеет только курсор для набора результатов.Он получает каждую строку из базы данных через этот курсор каждый раз, когда вы вызываете метод next ().Вполне логично использовать некоторые «исключения» в сценариях, связанных с очень большим количеством строк, как часть запроса таблицы.

Поскольку вы «проектируете» свой собственный драйвер на основе csv, вы свободныизменить поведение next() API .Хотя в подписи указано, что она может выдать SQLException, вы можете закодировать реализацию метода next так, чтобы он возвращал пустой или частично заполненный объект, чтобы сделать его отказоустойчивым.

Существуют устаревшие методы длянайти общее количество записей в ResultSet, например, вызвать last(), а затем вызвать ResultSet::getRow(), чтобы узнать количество записей, прежде чем вы начнете выполнять итерации.

1 голос
/ 14 сентября 2011

Вам решать, будет ли ваша реализация на самом деле генерировать исключение из этих методов, просто потому, что он находится в интерфейсе, не обязывает вас его генерировать. Но если что-то пойдет не так, когда у вашего водителя возникнут проблемы с определением, есть ли следующий ряд, я сомневаюсь, что он будет восстановлен. Я имею в виду, что если ваш базовый код генерирует IOException по какой-либо причине (доступ к сети, разрешение, аппаратный сбой, какой-то другой процесс удалил файл из-под вас), может быть разумным сделать исключение.

0 голосов
/ 14 сентября 2011

SQLException здесь следует выдавать только в случае возникновения ошибки доступа к базе данных или при вызове этого метода для закрытого набора результатов. (см. Javadoc ResulSet)

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

Я не вижу здесь проблемы: у вас есть следующий ряд или нет. А когда возникнут проблемы, бросьте исключение.

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

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

0 голосов
/ 14 сентября 2011

, хотя большинство согласны с тем, что JDBC повсеместно загрязнен (проверено!) Исключениями, значение исключения: «Извините, я не знаю, произошла эта ошибка», поэтому оно не возвращает значение, если исключение поднял. Такой случай: «Я потерял связь», или случилось нечто еще худшее.

Если вы знаете, что после этого есть строка, верните true.

Если следующая строка является уродливой, выведите исключение при извлечении уродливой строки, даже если вы сможете обнаружить ее во время выполнения метода "next ()".

0 голосов
/ 14 сентября 2011

Вы можете использовать isLast(), чтобы определить, находитесь ли вы в последнем ряду.Однако, это также бросит SQLException.

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