Comment éviter l'erreur OOM (Out of memory) lors de la récupération de tous les enregistrements de la table énorme?
Je suis chargé d'une tâche de convertir un énorme tableau de fichier XML personnalisé. Je serai à l'aide de Java pour ce travail.
Si j'ai simplement émettre un "SELECT * from client", elle peut retourner énorme quantité de données qui a fini par causer OOM. Je me demande, est-il une manière que je peux processus de l'enregistrement dès qu'il devient disponible, et supprimer l'enregistrement de la mémoire après que, au cours de sql processus de récupération?
--- edité le 13 Juillet 2009
Permettez-moi de préciser ma question. J'ai 1 serveur de base de données et 1 serveur d'application.
Quand je l'émission d'une requête de sélection dans l'application, les données de serveur de base de données de serveur d'application.
Je crois (corrigez-moi si je me trompe) ResultSet devrez attendre jusqu'à la réception de tous les enregistrements de la requête. Même si on fetch size 4, pour un 1000-enregistrement de la table, nous finissons toujours pas 1000 enregistrements dans la mémoire du tas de serveur d'application, est-il correct? Taille de l'extraction seulement une incidence sur le nombre d'aller-retour de/vers serveur de base de données.
Ma question est, comment commencer le traitement sur que 4 (ou n'importe quel nombre) documents immédiatement après l'arrivée de l'app serveur, et de le disposer à libérer de la mémoire dans le serveur d'application?
source d'informationauteur janetsmith
Vous devez vous connecter pour publier un commentaire.
Je pense que vous pouvez utiliser la même solution que cette une. Un défilement jeu de résultats.
Avec un peu plus d'informations que je peux obtenir une réponse utile.
Si vous utilisez MySQL:
de http://www.oracle.com/technology/tech/java/sqlj_jdbc/htdocs/jdbc_faq.html:
Si vous êtes à l'aide de JDBC, vous pouvez utiliser un jeu de résultats avec un curseur qui vous itérer à travers un enregistrement à la fois. Vous devez assure alors que vous écrivez votre XML pour un fichier d'un enregistrement à la fois plutôt que d'utiliser le DOM pour générer le XML.
Une règle de base que j'ai appris de mon expérience, c'est que vous n'apportez JAMAIS TOUTES les données de la base de données de votre serveur d'applications. Une chose que vous pouvez faire est de mettre en œuvre une procédure de page à vos données.
Vous pouvez apporter une page de données contenant environ 1000 à 5000 enregistrements, de les traiter, puis de nouveau de récupérer les données de la page suivante.
Un concept pour l'exportation de la totalité de la table.
(à Noter que pour les experts: je suis conscient de ses défauts.)Modifier Les défauts (merci @J. S.):
À quel stade en est le OOM erreur se produise, il est sur la récupération de données ou de traitement de données pour fichier XML?
Si son extraction de données, d'obtenir les données par lots. Obtenir le nombre total de lignes de la première, de l'ordre de la sélectionne par la clé primaire et de restreindre le nombre de lignes sélectionnées à croquer tailles.
Si sa à la création du fichier XML, envoyer le nœud XML de chaque client pour le Système..println, ne pas le retenir dans la mémoire. Lancer le programme via commad ligne et de rediriger toutes les sorties dans un fichier;
En boucle l'enregistrement de tous est enregistré dans le fichier.