8
votes

Inserts en vrac avec ressort / hibernate

J'utilise dans ma candidature un printemps / hibernate de mélange (rien d'original). Pour une fonctionnalité donnée, je dois importer le contenu d'un fichier CSV dans une table de My Oracle DB. Pour l'instant, je juste créer les objets, je fais xxx

sur chacun d'entre eux (j'ai besoin de récupérer leur identifiant nouvellement attribué)

alors la transaction se produit à la fin. de la méthode, à l'aide de l'API de transaction de ressort.

Tout fonctionne bien, sauf la performance, ce qui est correct pour des objets de 5 000 5000, mais pas pour 100 000 ...

donc je regarde pour les idées pour accélérer ce genre de choses. J'ai entendu parler des inserts en vrac avec hibernate, mais je n'ai pas trouvé de référence solide. Quelqu'un peut-il me donner quelques idées pour effectuer cette importation avec une plus grande performance?


2 commentaires

Ne veut pas dire être un imbécile ici, mais la documentation sur cette question est assez concise et ne prend que 5 minutes à lire: docs.jboss.org/hibernate/stable/core/reference/fr/html/...


Merci pour le lien, ce que je cherchais exactement. J'ai fait des recherches avant et je ne l'ai pas trouvée, mais je suis un débutant concernant la creuse dans la documentation hibernate.


4 Réponses :



7
votes

Quelque chose de simple Vous pouvez essayer, c'est affleurer et effacer la session dire tous les 100 objets ...

Exécuter xxx

tous les 100 ou 1000 inserts.

qui affleurera et effacera la session hibernate et l'empêche de pousser trop gros (éventuellement pourquoi vos 100 000 objets prennent si longtemps).

En outre si vous utilisez le générateur d'identifiant d'identité Hibernate Tourner silencieusement les inserts de lot. Les inserts de lot amélioreront les performances. Vous devez également spécifier la propriété de configuration hibernate.jdbc.batch_size équivalente à votre 100 à un numéro de temps.

La persistance Java de Manning avec hibernate était la source de ceci (super livre - sauvé ma peau de nombreuses fois. ).


0 commentaires

3
votes

Parfois, une ormapper n'est pas le marteau droit pour le clou. Surtout les opérations par lots sont souvent plus performantes à l'aide d'un ancien JDBC uni. Cela dépend bien sûr de diverses conditions, mais vous devriez au moins voir cela comme une option et comparer la performance des deux approches.


0 commentaires

0
votes

Ce n'est pas purement un problème de performance insertion de la base de données; Si vous créez des dizaines de milliers d'objets et que vous n'effectuez pas de rinçage, la session Hibernate augmentera jusqu'à ce que vous manquiez de mémoire.


0 commentaires