ResultSet: Получение значений столбцов индексом по сравнению с получением маркировкой

50
задан pyb 16 October 2015 в 08:12
поделиться

10 ответов

Необходимо использовать строковые маркировки по умолчанию.

Профессионалы:

  • Независимость порядка столбцов
  • Лучшая удобочитаемость/пригодность для обслуживания

Недостатки:

  • Вы не имеете никакого контроля над именами столбцов (доступ с помощью хранимых процедур)

, Который Вы предпочли бы?

ints?

интервал i = 1;
customerId = resultSet.getInt (я ++);
customerName = resultSet.getString (я ++);
customerAddress = resultSet.getString (я ++);

или Строки?

customerId = resultSet.getInt ("customer_id");
customerName = resultSet.getString ("customer_name");
customerAddress = resultSet.getString ("customer_address");

И что, если там новый столбец вставляется в положении 1? Какой код Вы предпочли бы? Или если бы порядок столбцов изменяется, какую версию кода необходимо было бы изменить вообще?

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

46
ответ дан Martin Klinke 7 November 2019 в 10:40
поделиться

Помимо взгляда в Карте для маркировок это также приводит к дополнительному Строковому созданию. Хотя это будет происходить на стеке, но тем не менее этом кариес стоимость с ним.

Все это зависит от отдельного выбора и до даты, я использовал только индексы:-)

0
ответ дан Vinod Singh 7 November 2019 в 10:40
поделиться

Используя индекс попытка оптимизации.

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

я думаю, что это - наш встроенный инстинкт для использования чисел вместо текста.

0
ответ дан databyss 7 November 2019 в 10:40
поделиться

Я соглашаюсь с предыдущими ответами, что производительность не что-то, что может вынудить нас выбрать любой из подходов. Было бы хорошо рассмотреть следующие вещи вместо этого:

  • удобочитаемость Кода: для каждого разработчика, читающего Ваши маркировки кода, имеют намного больше смысла, чем индексы.
  • Обслуживание: думайте о SQL-запросе и способе, которым он сохраняется. Что, более вероятно, произойдет в Вашем случае после SQL-запроса фиксации/улучшения/рефакторинга: изменение порядка столбцов извлеченные или меняющие имена столбца результата. Кажется для меня, что изменение порядка извлеченных столбцов (как результаты добавления/удаления новых столбцов в наборе результатов) имеет большую вероятность для случая.
  • Инкапсуляция: несмотря на путь Вы выбираете попытку изолировать код, куда Вы выполняете SQL-запрос и анализируете набор результатов в том же компоненте и делаете только этот компонент знающим об именах столбцов и их отображении на индексы (если Вы решили использовать их).
0
ответ дан Cha2lenger 7 November 2019 в 10:40
поделиться

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

1
ответ дан zloster 7 November 2019 в 10:40
поделиться

Я не думаю с помощью производительности влияния маркировок очень. Но существует другая причина не использовать String с. Или int с, в этом отношении.

Рассматривают использование констант. Используя int постоянный делает код больше четко, но также и менее вероятно иметь ошибки.

Помимо того, чтобы быть более читаемым, константа также препятствует тому, чтобы Вы делали опечатку на имена маркировки - компилятор бросит ошибку, если Вы сделаете. И любой IDE, стоящий чего-либо, возьмет его. Дело обстоит не так, если Вы используете String с или ints.

2
ответ дан Sietse 7 November 2019 в 10:40
поделиться

Предупреждение: я собираюсь стать претенциозным здесь, потому что это сводит меня с ума.

99%* времени, это - смешная микрооптимизация, что у людей есть некоторое смутное представление, делает вещи 'лучше'. Это полностью игнорирует то, что, если Вы не находитесь в чрезвычайно трудном и занятом цикле более чем миллионы результатов SQL все время , который, надо надеяться, редок, Вы никогда не будете замечать его. Для всех, кто не делает, это, стоимость времени разработчика maintaing, обновления и исправления ошибок в индексации столбца намного больше, чем возрастающая стоимость аппаратных средств для Вашего infinitesimally-worse-performing приложения.

не Делают оптимизации кода как это в. Код для человека, поддерживающего его. Тогда наблюдайте, измерьте, проанализируйте и оптимизируйте. Наблюдайте снова, имейте размеры снова, проанализируйте снова и оптимизируйте снова.

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

* иллюстрация составлена.

56
ответ дан Cowan 7 November 2019 в 10:40
поделиться

Я сделал некоторое профилирование производительности на этом точном предмете на базе данных Oracle. В нашем коде у нас есть ResultSet с многочисленным colums и огромным количеством строк. Из этих 20 секунд (!) запрос берет для выполнения метода oracle.jdbc.driver. ScrollableResultSet.findColumn (Имя строки) занимает приблизительно 4 секунды.

, Очевидно, существует что-то не так с общим замыслом, но использующие индексы вместо имен столбцов, вероятно, взяли бы это на расстоянии в 4 секунды.

2
ответ дан 7 November 2019 в 10:40
поделиться

Ответ принят, тем не менее, вот некоторая дополнительная информация и личный опыт, которые я еще не видел.

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

Однако индексы столбцов можно использовать. В некоторых случаях они работают быстрее, но не настолько, чтобы перекрывать указанные выше причины для имен *. Это очень ценно при разработке инструментов и общих методов, работающих с ResultSet s. Наконец, может потребоваться индекс, потому что у столбца нет имени (например, безымянного агрегата) или есть повторяющиеся имена, поэтому нет простого способа сослаться на оба.

* Обратите внимание, что я написал несколько драйверов JDBC и заглянул внутрь некоторых из открытых источников, и внутри они используют индексы столбцов для ссылки на столбцы результатов. Во всех случаях, с которыми я работал, внутренний драйвер сначала сопоставляет имя столбца с индексом. Таким образом, вы можете легко увидеть, что имя столбца во всех этих случаях всегда занимало больше времени. Однако это может быть не для всех драйверов.

6
ответ дан 7 November 2019 в 10:40
поделиться

Конечно, использование названий колонок повышает читабельность и облегчает обслуживание. Но использование названий колонок имеет обратную сторону. Как вы знаете, SQL позволяет использовать несколько имен колонок с одним и тем же именем, нет никакой гарантии, что имя колонки, введенное вами в методе getter resultSet, на самом деле указывает на имя колонки, к которой вы собираетесь получить доступ. Теоретически, использование индексных номеров вместо названий колонок предлагается, но это снижает удобочитаемость...

Спасибо

4
ответ дан 7 November 2019 в 10:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: