54 votes

ResultSet: récupération des valeurs de colonne par index par rapport à récupération par étiquette

Lors de l'utilisation de JDBC, j'ai souvent rencontré des constructions comme les

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

Je me suis demandé (et les auteurs de code aussi) pourquoi ne pas utiliser des étiquettes pour récupérer les valeurs de la colonne:

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

La meilleure explication que j'ai entendu, c'est quelque chose au sujet de la performance. Mais en réalité, cela fait-il de transformation extrêmement rapide? Je ne le crois pas, bien que je n'ai jamais effectué des mesures. Même si la récupération par le label serait un peu plus lent, néanmoins, fournir une meilleure lisibilité et à la flexibilité, à mon avis.
Si quelqu'un pourrait me donner une bonne explication d'éviter de récupérer les valeurs de la colonne par colonne de l'index au lieu de la colonne étiquette? Quels sont les avantages et les inconvénients des deux approches (peut-être, concernant certains SGBD)?

59voto

Cowan Points 17235

Avertissement: je vais me faire pompeux ici, parce que cela me rend fou.

99%* du temps, il est ridicule de micro-optimisation que les gens ont une vague idée qui rend les choses meilleures. Cela ignore complètement le fait que, sauf si vous êtes dans une situation extrêmement serré et occupé de la boucle sur les millions de résultats SQL tout le temps, ce qui est heureusement rare, vous ne serez jamais le remarquer. Pour tous ceux qui ne pas le faire, le développeur coût du temps de maintenant, la mise à jour et correction de bugs dans la colonne d'indexation sont bien plus élevés que le coût incrémental de matériel pour vos infiniment-pire encore-de l'exécution de l'application.

Ne pas les optimisations de code comme ceci. Code pour la personne qui la maintient. Ensuite, observer, mesurer, analyser et optimiser. Observer à nouveau, mesurer à nouveau, de les analyser de nouveau, et d'optimiser de nouveau.

L'optimisation est à peu près la dernière étape dans le développement, la pas le premier.

* La Figure est faite.

50voto

Martin Klinke Points 4157

Vous devriez utiliser de la chaîne d'étiquettes par défaut.

Pour:

  • L'indépendance de l'ordre des colonnes
  • Une meilleure lisibilité/maintenabilité

Inconvénients:

  • Vous n'avez aucun contrôle sur les noms de colonne (accès via des procédures stockées)

Laquelle préférez-vous?

ints?

int i = 1;
customerId = resultSet.getInt(i++);
nomclient = resultSet.getString(i++);
customerAddress = resultSet.getString(i++);

ou des Chaînes de caractères?

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

Et si il y a une nouvelle colonne insérée à la position 1? Le code qui préférez-vous? Ou si l'ordre des colonnes est modifié, le code de la version auriez-vous besoin de changement à tous?

C'est pourquoi vous devez utiliser de la chaîne d'étiquettes par défaut.

8voto

Kevin Brock Points 4695

La réponse a été accepté, aucun-le-moins, voici quelques informations supplémentaires et de l'expérience personnelle que je n'ai pas vu mettre de l'avant encore.

Utiliser les noms de colonne (constantes et non littéraux de préférence) en général et, si possible. C'est à la fois plus clair, plus facile à maintenir, et des changements à venir sont moins susceptibles de se briser le code.

Il est, cependant, une utilisation de la colonne d'index. Dans certains cas, elles sont plus rapides, mais pas suffisamment pour que cela devrait remplacer les raisons ci-dessus pour les noms*. Ceux-ci sont très précieux lors du développement d'outils et de méthodes générales de traiter avec ResultSets. Enfin, un index peut être nécessaire parce que la colonne n'est pas un nom (comme un sans nom d'agrégation) ou il y a des noms en double, donc il n'y a pas de moyen facile de référence à la fois.

*Notez que j'ai écrit certains pilotes JDBC et regarda à l'intérieur de certaines sources ouvertes et en interne, ces, utiliser la colonne des indices de référence les colonnes de résultat. Dans tous les cas, j'ai travaillé avec, le pilote interne premières cartes d'un nom de colonne à un indice. Ainsi, vous pouvez facilement voir que le nom de la colonne, dans tous ces cas, serait toujours prendre plus de temps. Cela peut ne pas être vrai pour tous les pilotes de si.

2voto

Sietse Points 3240

Je ne pense pas qu'en utilisant les étiquettes des impacts de la performance par beaucoup. Mais il y a une autre raison de ne pas utiliser Strings. Ou ints, pour cette question.

Envisager d'utiliser des constantes. À l'aide d'un int constante rend le code plus lisible, mais aussi moins susceptibles d'avoir des erreurs.

En plus d'être plus lisible, la constante vous empêche également de faire des fautes de frappe dans les noms d'étiquette - le compilateur génère une erreur si vous ne. Et de toute IDE vaut rien ramasser. Ce n'est pas le cas si vous utilisez Strings ou ints.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X