-
Taille du ResultSet
Bonjour,
Dans le cadre d'un TP, on doit réaliser un convertisseur de DB.
J'ai juste une interrogation: comment faire (proprement) pour lire les données de l'ensemble d'une table (en fait de toutes les tables d'une DB) et les injecter dans la nouvelle BD?
J'ai à l'esprit d'utiliser un ResultSet avec un statement 'Select * from maTable' et ensuite un while (rs.next()) et un autre statement 'Insert into....'.
Dans le principe je suis d'accord mais quid si ma BD contient 10 000 000 de lignes avec 200 champs.
Bref, ma question est : est-ce qu'un ResultSet contient TOUTES les données de la table ou est-ce qu'il 'voyage' au fur et à mesure qu'on avance dans le ResultSet?
J'ai cherché mais à part un post qui traitait vaguement d'un getFetchSize, je n'ai pas plus d'information là dessus. Et encore, pas tout compris.
Donc, quid d'un ResultSet?
Merci
-
Bonjour
Je ne suis pas un grand spécialiste de JDBC, mais ce que j'ai compris de la documentation de l'API 1.6 sur les objets Statement et Resultset, c'est que la requête est clairement exécutée et la réponse complète est renvoyée par la BD dans le ResultSet.
Don, bien que je trouve cela invraisemblable, si vous avez une table de 10 000 000 de lignes avec 200 colonnes, vous récupérerez l'intégralité dans le ResultSet. Du moins, c'est le point de vue Java.
Je penses que pour le concret, il faut plutôt se pencher sur le Driver jdbc employé. En effet, la réalisation des opérations est faite par ce dernier, et on peut imaginez que les données ne soit récupérée qu'au coup par coup pour des raisons de performances, mais là, je n'en sais pas assez.
Qu'utilisez-vous comme Driver ?
Quels sont les types des bases de données source et cible ?
MySQL, Access, Oracle ???
Cependant, sans chercher plus loin, je suppose qu'en réalisant des requêtes exploitant la clause LIMIT du SQL pourraient permettre de contrôler en quelque sorte le débit.
Quand à la duplication, copier une base vers une autre, il faut bien à un moment que l'ensemble des données soit déplaçées ?!....
-
Des précisions
Voilà, pendant que je vous répondais, j'ai consulté plus sérieusement la documentation.
En fait, avec la commande getFetchSize() de la classe ResultSet, vous récupérez la taille d'un bloc.
En fait, le driver récupère les données résultante de la requête bloc par bloc, et non pas intégralement. La taille du bloc peut donc être connue grâce à cette méthode getFetchSize().
Donc, le Resultset ne contiendra jamais toutes les données de la réponse (du moins s'il s'agit d'une requête renvoyant un grand nombre de lignes), mais un découpage en bloc de taille X. Le déplacement dans le Resulset via la commande next() déclenchera le chargement en mémoire du prochain bloc lorsque le premier aura été entièrement parcouru.
:P
Note :
Si vous voulez des précisions, vous pouvez toujours consulter le lien suivant.
http://java.developpez.com/faq/jdbc/...esultset#fetch
-
Merci pour la réponse.
C'est clair, net et précis.
:ccool: