2013-03-11 4 views
0

Je travaille sur une interface qui fait l'interaction DB sur un système. Dans le cadre de mon travail, je suis supposé interroger la source db, invoquer une procédure, obtenir les données dans un curseur de référence et remplir la destination db.traitement énorme volume de données

Comme le volume de données peut être énorme, j'utilise le multi-threading sur la destination db pour invoquer la procédure. Par exemple, si le nombre total d'entrées supposées être chargées est de 1 million, alors à la destination db, la procédure est appelée disons 10 fois avec 100K enregistrements chacun.

Cette configuration fonctionne correctement sauf lorsque le volume de données à la source db est énorme (par exemple, plus de 2 millions d'entrées). J'ai mis environ 20 Go d'espace de tas pour le traitement de l'enregistrement, mais mon programme échoue avec une erreur de mémoire de tas. Je veux savoir s'il existe un moyen d'interroger les données à partir de la base de données source en mode parallèle (par exemple, un total de 2 millions d'enregistrements est récupéré à partir de la procédure stockée source, mon programme doit d'abord aller chercher un sous-ensemble de cet enregistrement et passer ensuite à la prochaine ou quelque chose comme ça).

Une des solutions que j'ai proposées est d'envoyer les enregistrements de cette manière, mais je veux savoir s'il existe une meilleure alternative. S'il vous plaît suggérer

+0

vous pouvez émettre des requêtes différentes pour sous-ensemble les données ... ajouter un WHERE caluser quelque chose comme WHERE id <10000 sur la première exécution, puis WHERE id> 10000 et id <20000 pour la prochaine exécution, etc – Randy

+0

Je n'ai jamais vu une base de données «réelle» où il était impossible de limiter le nombre d'enregistrements récupérés en même temps (même si je suis sûr que quelqu'un ici peut en identifier un). SQL a les mots-clés LIMIT et OFFSET. –

Répondre

0

J'ai trouvé une solution à cela. La classe BeanPropertyRowMapper dans l'API Spring doit être étendue et vous devez remplacer la méthode mapRow. La méthode mapRow est appelée lorsque les données sont prêtes à être récupérées. Vous pouvez appliquer une sorte de mécanisme de traitement par lots à ce stade. S'il vous plaît noter que j'ai posté la question que les données sont récupérées en utilisant la procédure stockée et la sortie se présente sous la forme d'un curseur de référence.

Questions connexes