IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

[EclipseLink] OutofMemory lors d'un "batch" insert


Sujet :

JPA Java

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut [EclipseLink] OutofMemory lors d'un "batch" insert
    Bonjour,
    Je suis en train de protoyper une appli qui persiste un objet Java dans une base de donnée relationnel via JPA (EclipseLink).
    L'idée est de mesurer les performances pour un grand nombre d'insertion à la suite (environ 300000 voir plus)

    Voici un le code en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
      for (int i = 0; i <300000; i++) {
    	 if(!em.isOpen()){
    		em = factory.createEntityManager(); //On utilise un EntityManager par batch (cf la doc EclipseLink sur l'optimisation des écritures 
    		em.getTransaction().begin(); 
    	}
    	Person person = new Person();
    	person.setFirstName("Jim_" + i);
    	person.setLastName("Knopf_" + i);
    	em.persist(person);
    	person = null;
     
             if(i%10000 == 0){ //Commit toutes les 10 000 insertions
    		 em.getTransaction().commit();
    		 em.close();
    	}
    }
    Ce code explose ma java heap memory.
    Existe-t-il des méthodes (des patterns) pour faire ce genre manipulation avec JPA le plus efficacement possible ?

    Pour info : j'ai un second proto 100% JDBC qui éxécute cet insertion en environ 6-7s sur ma machine (avec SQLite). Puis-je espérer obtenir des performances se rapprochant (disons environ 10-15s) avec une solution à base de JPA ?

    Cordialement

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    10'000 c'est un peu trop essaye de faire un commit avec un nombre plus restreint d'entité

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Utilise la méthode clear de ton EntityManager plutôt que close.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo