ResultSet: Récupérer les valeurs de la colonne par rapport à l'indice de la récupération par le label
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)?
- Est-il des constantes pour l'utiliser? Quelque chose comme " jeu de résultats.CUSTOMER_ID'
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser chaîne d'étiquettes par défaut.
Pour:
Contre:
Laquelle préférez-vous?
ints?
ou de Chaînes de caractères?
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 chaîne d'étiquettes par défaut.
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.
Optimisation est à peu près la dernière étape dans le développement, la pas le premier.
* Chiffre.
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.
Utilisent des 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 y a, 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
ResultSet
s. 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 si.
À partir de la documentation de java:
Bien sûr, chaque méthode (nommée ou indexé) a sa place. Je suis d'accord le nom de colonnes doit être la valeur par défaut. Toutefois, dans les cas où un grand nombre de boucles est nécessaire, et où l'instruction SELECT est défini et maintenu dans la même section de code (ou de classe), les indices devraient être ok - il est conseillé de liste colonnes sélectionnées, et pas seulement "SELECT * from...", depuis n'importe quelle table de changement de briser le code.
Sûr, utiliser des noms de colonnes augmente la lisibilité et rend l'entretien facile. Mais en utilisant des noms de colonne a un revers de médaille. Comme vous le savez, SQL permet de multiples noms de colonne avec le même nom, il n'y a aucune garantie que le nom de la colonne que vous avez tapé dans la méthode de lecture de l'objet resultSet points pour le nom de la colonne que vous avez l'intention d'accès. En théorie, à l'aide de numéros d'index au lieu de noms de colonne est préférée, mais il réduit la lisibilité...
Grâce
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
String
s. Ouint
s, 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
String
s ouints
.J'ai fait un peu de profilage des performances sur ce sujet précis sur une base de données Oracle. Dans notre code, nous avons un jeu de résultats avec de nombreuses colonnes et un grand nombre de lignes. De la 20 secondes (!) la demande nécessaire à l'exécution de la méthode d'oracle.jdbc.le pilote.ScrollableResultSet.findColumn(String nom) prend environ 4 secondes.
Évidemment il ya quelque chose de mal avec l'ensemble de la conception, mais en utilisant les indices de la place de la colonne des noms serait probablement profiter de cette 4 secondes.
Vous pouvez avoir le meilleur des deux! La vitesse de l'utilisation d'index avec la maintenabilité et de la sécurité dans l'utilisation des noms de colonne.
Premier, sauf si vous êtes en boucle à travers un ensemble de résultats suffit d'utiliser des noms de colonne.
Définir un ensemble de variables de type entier, un pour chaque colonne, vous aurez accès. Les noms de variables peuvent inclure le nom de la colonne: par exemple, iLast_Name.
Avant de l'ensemble de résultats de boucle d'itérer à travers la colonne de métadonnées et de définir la valeur de chaque variable de nombre entier à l'index de colonne du nom de la colonne correspondante. Si l'indice de la 'Last_Name' colonne 3 puis définissez la valeur de 'iLast_Name' à 3.
Dans l'ensemble de boucle d'utiliser l'entier des noms de variables dans les méthodes GET/SET. Le nom de la variable est une indication visuelle pour le développeur/responsable de la véritable nom de la colonne en cours d'accès, mais la valeur de l'index de colonne et de se donner les meilleures performances.
REMARQUE: la cartographie initiale (c'est à dire le nom de colonne de l'index de la cartographie) est effectuée qu'une seule fois avant la boucle, plutôt que pour chaque enregistrement et de la colonne dans la boucle.
Le pilote JDBC prend soin de la colonne de l'index de recherche. Donc, si vous extrayez les valeurs par nom de colonne à chaque fois que le conducteur a fait une look-up (généralement en hash map) afin de vérifier l'index correspondant pour le nom de la colonne.
Je suis d'accord avec les réponses précédentes que la performance n'est pas quelque chose qui peut nous forcer à sélectionner l'une des approches. Il serait bon de considérer les choses suivantes à la place:
L'aide de l'index, une tentative d'optimisation.
Le temps économisé par là, c'est gaspillée par des efforts supplémentaires, il prend le développeur pour rechercher les données nécessaires pour vérifier si leur code ne fonctionne plus correctement après les modifications.
Je pense que c'est notre intégrés dans l'instinct de l'utilisation des numéros au lieu de texte.
En plus de l'aspect de la Carte pour les étiquettes, il conduit également à une augmentation de la Chaîne de création. Bien qu'il se passe sur la pile, mais encore il caries un coût avec elle.
Tout dépend du choix de l'individu et jusqu'à date, j'utilise uniquement des indices 🙂
Comme il est souligné par d'autres affiches, je m'en tiendrais aux noms de colonne, sauf si vous avez une très bonne raison de ne pas le faire. L'impact sur les performances est négligeable par rapport à, par exemple, l'optimisation de la requête. Dans ce cas, l'entretien est beaucoup plus important qu'une petite optimisation.