Comment puis-je récupérer un JDBC ResultSet comme une ArrayList?
Je suis en train de faire une requête pour récupérer une grande quantité de Id (nombres entiers). Au lieu d'itération des millions de fois à travers le jeu de résultats et de tout recopier un par un à une liste de tableaux, est-il un moyen de récupérer tout comme une liste de tableaux?
Je comprends que le jeu de résultats est censé être itéré parce que l'implémentation sous-jacente peut être mise en cache des choses, mais dans ma situation, j'ai juste besoin de tous les Id tout de suite. Je sais que je peux définir la FetchSize à un grand nombre, mais je dois encore récupérer l'Id d'un-à-un.
Clarification: la raison pour laquelle je veux faire, c'est de la performance. Profilage me montre que faire le jeu de résultat.next(), jeu de résultats.getInt() et liste de tableaux.ajouter() des millions de fois prend du temps. Je suppose que la base de données (je suis en utilisant H2, qui est écrit en Java) a sans doute le tableau ou une liste quelque part dans la mémoire, donc je suis à la recherche d'un moyen de le copier à moi directement au lieu de passer par le jeu de résultats de l'itération de l'interface.
int[] ou de la Liste sont tous les deux très bien. Je suis tout simplement à la recherche d'un moyen de dire à la base de données: oublier la mise en cache/chargement paresseux/etc., donnez-moi juste les données aussi rapidement que vous le pouvez 🙂
Avoir un profil et voir où est le problème de performance. (Oracle n'avez obtenir un tableau de la colonne méthodes sur son jeu de résultats, IIRC. Non pas que ce qui compte pour un H2.)
OriginalL'auteur Deckard | 2009-03-13
Vous devez vous connecter pour publier un commentaire.
À l'aide de l'Apache DbUtils de la bibliothèque, vous pouvez facilement retourner un jeu de résultats comme une Liste de Cartes.
DbUtils est une bibliothèque d'aide, de sorte que votre encore à l'aide de JDBC. Jetez un oeil à leur site pour quelques-uns des avantages de l'utilisation de DbUtils. commons.apache.org/dbutils
Je comprends, mais l'OP semble avoir changé la question après que vous aviez répondu. Ils étaient à la recherche d'un moyen de contourner l'API JDBC, afin d'améliorer les performances...
Il est difficile de répondre sans savoir ce que l'OP est en train de faire avec l'Id. Je ne voudrais pas regarder pour optimiser l'itération, mais essayez de trouver un moyen pour accomplir la même tâche, de sorte qu'il ne nécessite pas de remplissage d'un local de la structure de données avec des millions d'Identifiants.
L'ensemble de la base de données Java mécanismes d'accès que je connais (JDO/JPA/DBUtils) sont en fait JDBC sous le capot.
OriginalL'auteur Mark
Mettre le code dans une méthode. Il est très simple de les appeler des méthodes...
Sur le dessus de ma tête:
Puis il suffit de l'appeler comme:
Fait.
comment voulez-vous "dump" sans boucle à travers les données? (Le dernier paragraphe de la question n'était pas dans l'original, btw.)
OriginalL'auteur Tom Hawtin - tackline
Si votre problème est la mauvaise performance, réglez la déclaration avant de l'exécuter avec
Expérience avec 100, 1000, 10000,.. Cela permettra d'éviter les allers-retours, ce qui peut être la cause de la lenteur que vous avez mentionné.
Aussi, ArrayList.ajouter() peut être lent si il faut redimensionner le tableau interne à de nombreuses reprises, car il crée un nouveau tableau et des copies de toutes les données. Essayez LinkedList à la place.
De ce que j'ai compris, la question de l'auteur a été l'ajout de tous les retours d'Id pour une liste unique. Cela signifie que votre suggestion n'a pas vraiment vous aider si vous créez un tableau avec la taille totale de l'ensemble de résultats, non seulement la fetchsize.
Cette question n'a toujours pas accepté de répondre, Avez-vous résolu ce problème ?
Pas de. Malheureusement, JDBC simplement ne pas exposer une telle construction, donc la seule façon possible de le faire serait si certaines Java-mise en œuvre de la base de données explicitement les exposer.
OriginalL'auteur Antonio