Bonjour a tous.
J'ai une appli qui gère des recopies de base vers base.
Je souhaite compter a partir du ResultSet le nombre de lignes, de manière a pouvoir renseigner une ProgressBar sur l'état d'avancement du transfert.
Il existe plusieurs solutions pour compter ce nombre de ligne.
Soit faire un count
Soit utiliser un scrollable ResultSet
soit en utilisant un RowSet...dans mon cas un OracleCacheRowSet
Toutes ces méthodes fonctionnent bien pour des petites requêtes...
Seulement certains de nos traitements gère beaucoup de ligne.
Un count(*) n'est pas une solution envisageable pour nous, car les requêtes de selection peuvent durer jusqu'a 20 min, donc multiplier ce nombre par deux juste pour avoir un suivi...c'est pas top.
Pour les deux autres solutions...j'abouti a un magnifique OutOfMemoryError...
En effet, j'ai regardé avec JProbe l'état de la mémoire de la JVM
Dans le cas d'un ResultSet scrollable...la mémoire utilisée augmente progressivement jusqu'au OutOfMemoryError lors de la boucle sur le ResultSet.
Quand au RowSet, c'est pire, en effet, il rempli lors de l'éxecution de la requête la mémoire jusqu'au OutOfMemoryError, sans même entrer dans la boucle rs.next()...
Pour info, en gros, je fais un select dans ma base, puis je boucle sur le resultSet , et pour chaque ligne de ce ResultSet...je fais un insert dans une autre table....
Je souhaite savoir si quelqu'un a déjà rencontré ce problème, et si éventuellement quelqu'un a une astuce pour le régler...
Je tiens a préciser que si j'utilise un resultSet avec pour type TYPE_FORWARD_ONLY je n'ai aucun message d'erreur...ca fonctionne très bien...
(Je reste sous la barre des 5Mo de mémoire de la JVM utilisée, alors qu'avec les deux autres méthodes j'explose les 64Mo).
Je suis aussi au courant qu'il est possible d'augmenter la taille de la mémoire de la JVM... avec l'option -xmx de java...mais je ne trouve pas cela très propre....
Merci d'avance!
Partager