2010-12-02 24 views
0

Nous avons une grande table d'environ 1 million de lignes et un fichier de données avec des millions de lignes. Nous devons fusionner régulièrement un sous-ensemble des données dans le fichier texte dans une table de base de données. La raison principale de cette lenteur est que les données dans le fichier ont des références à d'autres objets JPA, ce qui signifie que les autres objets jpa doivent être relus pour chaque ligne du fichier. Imaginez-à-dire que nous avons 100.000 personnes et 1000000 objets actifsFusionner une grande table avec un gros fichier texte en utilisant JPA?

objet Personne -> Liste des actifs

Notre application utilise actuellement JPA pur pour tous ses besoins de manipulation de données. Existe-t-il un moyen efficace de le faire en utilisant les méthodologies JPA/ORM ou vais-je avoir besoin de revenir aux commandes SQL et au fournisseur spécifiques?

+0

Pouvez-vous donner plus de détails sur votre processus de fusion/exigences? Votre préoccupation au sujet de l'APP est-elle liée à la performance ou simplement «comment puis-je faire cela»? –

+0

Oui la question est juste "comment puis-je faire cela". Évidemment, nous pourrions juste lire le fichier ligne par ligne, et essayer d'insérer des lignes qui n'existent pas déjà. Cela prend environ 9 heures en utilisant une base de données Oracle sur une connexion LAN assez rapide. –

Répondre

0

Une réponse possible qui est douloureusement lent est de faire ce qui suit

  • Pour chaque ligne dans le fichier:

    • Lire la ligne de données
    • d'extraction objet de référence
    • vérifier si les données sont attachées à l'objet de référence
    • sinon ajouter des données à l'objet de référence et persister

lent Il ne vaut pas considérer. Pourquoi ne pas utiliser une technique ancienne: diviser et conquérir?

1

Diviser le fichier en petits morceaux et ensuite avoir des processus parallèles fonctionnent sur ces petits fichiers simultanément.

Et utilisez les insertions par lots/mises à jour offertes par JPA et Hibernate. plus de détails here

Le moyen idéal à mon avis est d'utiliser le support par lots fourni par JDBC simple, puis de commettre à intervalles réguliers.

Vous pourriez également vouloir regarder spring batch car il a fourni split/parallélisation/itération à travers les fichiers, etc out of box. J'ai utilisé tous ces éléments avec succès pour une application de taille considérable.