ResultSet: получение значений столбца по индексу по сравнению с извлечением по метке - PullRequest
49 голосов
/ 09 октября 2008

При использовании JDBC я часто сталкиваюсь с конструкциями типа

ResultSet rs = ps.executeQuery();
while (rs.next()) {
    int id = rs.getInt(1);
    // Some other actions
}

Я спросил себя (и авторов кода тоже), почему бы не использовать метки для получения значений столбцов:

int id = rs.getInt("CUSTOMER_ID");

Лучшее объяснение, которое я слышал, касается производительности. Но на самом деле, это делает обработку чрезвычайно быстрой? Я не верю в это, хотя я никогда не проводил измерения. Даже если поиск по метке будет немного медленнее, тем не менее, на мой взгляд, он обеспечивает лучшую читаемость и гибкость.
Так может ли кто-нибудь дать мне хорошее объяснение того, как избежать получения значений столбца по индексу столбца вместо метки столбца? Каковы плюсы и минусы обоих подходов (возможно, в отношении определенных СУБД)?

Ответы [ 13 ]

0 голосов
/ 19 декабря 2008

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

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

0 голосов
/ 09 октября 2008

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

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

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

0 голосов
/ 09 октября 2008

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

  • Удобочитаемость кода: для каждого разработчика, читающего ваши метки кода, гораздо больше смысла, чем для индексов.
  • Обслуживание: подумайте о SQL-запросе и способах его обслуживания. Что более вероятно произойдет в вашем случае после исправления / улучшения / рефакторинга SQL-запроса: изменение порядка извлечения столбцов или изменение имен столбцов результата. Мне кажется, что изменение порядка извлеченных столбцов (как результат добавления / удаления новых столбцов в наборе результатов) с большей вероятностью произойдет.
  • Инкапсуляция: несмотря на выбранный способ, попробуйте изолировать код, в котором вы выполняете SQL-запрос и анализировать набор результатов в одном и том же компоненте, и информировать только этот компонент об именах столбцов и их сопоставлении с индексами (если вы решили использовать их).
...