Bonjour,
Je suis actuellement en train de résoudre un problème de type OutOfMemoryException dû à un trop gros resultSet.
Afin de résumer le fonctionnement de mon application :
On boucle dans JAVA pour accéder à différentes tables d'une base postgresql :
- Une requête récupère les données de la table courante.
- Le programme JAVA les ajoute dans un iterator et les trie en fonction de critères définis (par exemple la date).
On écrit ensuite les données triée dans un fichier.
Les éléments récoltés s'accumulent dans la heap, ce qui nous amène à un crash de l'application quand le nombre d'entrées des tables est trop important.
J'ai imaginé plusieurs solutions pour résoudre cette erreur :
- Augmenter la taille de la heap, mais étant donné que les donnée peuvent aller du simple au double, ça ne ferait que retarder le problème.
- Ecrire dans le fichier au fur et à mesure, à la fin du traitement de chaque table, ainsi, le résultSet qui contient les données d'une seule table au lieu de 22, ne devient pas trop gros (on effectue par contre le traitement 22 fois au lieu de 1). Problème : Les lignes vont être triées d'abord par table dans le fichier final, puisqu'on écrit au fur et à mesure.
- Créer une vue qui sélectionne les données de toutes les tables voulues et les diviser avec un select pour diviser le traitement en plusieurs blocs (et être capable de reprendre la recherche là ou on s'est arrêté) :
La boucle exécuterait ensuite le select à nouveau pour rn >= 50000 et rn < 100000 et ainsi de suite jusqu'à la fin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 create view ll as select * from alert_event select * from (select *, ROW_NUMBER() over (order by time asc) as rn from ll) as t1 where rn >= 0 and rn < 50000
Problème : quand on utilise plusieurs tables dans la vue, une erreur arrive car plusieurs tables ont les même nom de champs (ex: id). Il faudrait donc les préciser pour chaque table au lieu de mettre étoile ce qui serait énorme pour 22 tables qui contiennent chacune une dizaine de champs. De plus, il faudrait trier les résultats selon une colonne commune dans le select, ce qui implique de faire des unions et de préciser encore une fois toutes les tables communes. J'imagine que ce n'est pas la meilleure solution
Auriez-vous une idée pour résoudre ce problème ?
Merci de votre aide.
Partager