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

JDBC Java Discussion :

Problème performance hibernate


Sujet :

JDBC Java

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Problème performance hibernate
    Bonjour,

    J'ai 2 millions de ligne à insérer dans une base SQL server avec hibernate.
    Mon problème, c'est que c'est extrêmement long : 5 minutes = 500 lignes insérées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	@Transactional(value="sqlServerTransactionManager")
    	public void save(List<Objet> listObjects){
     
    		for(Objet object : listObjects){
    			sqlServerEntityManagerFactory.persist(object );
    		}
     
     
    	}
    Comment faire améliorer les performances ? J'avais pensé à une procédure stockée ?

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    ne pas passer par JPA pour ce genre d'opération? Pour charger massivement des données dans une DB, il vaut mieux utiliser directement le la connection DB et faire du SQL brut.

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Tout les tuto que je vois sont avec JPA pour Spring

  4. #4
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 743
    Points
    3 743
    Billets dans le blog
    12
    Par défaut
    Salut,

    C'est lent pour plusieurs raisons, mais la raison principale est qu'une transaction est effectuée pour chaque objet inséré (START TRANSACTION; ... COMMIT;).

    JPA n'est pas prévu pour insérer une liste d'objet, mais si tu tiens absolument à garder ton pattern qui boucle sur une liste, tu peux toujours faire en sorte de démarrer la transaction, effectuer ta boucle qui insère, et commiter :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    em.getTransaction().begin(); 
     
    BOUCLE {
        em.persist(objet);
    }
     
    em.getTransaction().commit();

    A+

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Quand j'utilise le bout de code indiqué, sa ne marche pas.
    Sa me provoque une erreur en me disant que Spring gère les transaction

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Salut,

    C'est lent pour plusieurs raisons, mais la raison principale est qu'une transaction est effectuée pour chaque objet inséré (START TRANSACTION; ... COMMIT;).
    Heu non, l'entitymanager ne fait normalement partie d'un transaction globale existante.

  7. #7
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 743
    Points
    3 743
    Billets dans le blog
    12
    Par défaut
    @_tchize, Je vois bien qu'il y a une annotation @Transactional, mais je ne sais pas comment son entitymanager est configuré. Cinq minutes pour 500 objets c'est beaucoup trop lent, cette lenteur arrive généralement lorsque qu'il y a une transaction effectué par objet.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    J'ai visiblement confondu avec un autre sujet que je lisait où l'injection était dans un EJB

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Dans la mesure où l'annotation @Transactional est définie au niveau de la méthode et que la méthode fait une boucle pour persister les entités, il n'y a pas de commit à chaque écriture mais à la sortie de la méthode.

    Qu'est ce que "sqlServerEntityManagerFactory" au juste, le nom prête à confusion... c'est l'EntityManager ou c'est une classe à toi ?

    De manière générale, il n'est pas bon de faire de grosses boucles d'insertions sans se soucier des caches d'hibernate, il serait judicieux de "purger" le cache tous les x insert.
    Quelque chose comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int i = 0;
    for (Object o : entities) 
    {
        entityManager.persist(o);
        i++:
        if (i ^ 50 == 0) 
        {
            entityManager.flush();
            entityManger.clear();
        }
    }

  10. #10
    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
    +1 avec OButterlin

    Un peu de documentation sur le sujet:

    http://docs.jboss.org/hibernate/orm/...ide.html#batch

    https://vladmihalcea.com/2015/03/18/...ith-hibernate/

    Regarde également la propriété hibernate.jdbc.batch_size qui permet comme son nom l'indique de régler la taille des batch JDBC.

Discussions similaires

  1. Problème de performance Hibernate/Oracle
    Par gozzs dans le forum Hibernate
    Réponses: 1
    Dernier message: 04/06/2009, 15h52
  2. problème plugin Hibernate pour struts
    Par kaikai dans le forum Struts 1
    Réponses: 2
    Dernier message: 12/05/2006, 08h32
  3. [Hibernate] Problème avec Hibernate et Eclipse 3
    Par theseuby dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 30/03/2006, 21h31
  4. Réponses: 7
    Dernier message: 21/11/2005, 14h21
  5. Problème performance SELECT avec jointure
    Par Netgamer dans le forum Requêtes
    Réponses: 7
    Dernier message: 05/08/2005, 10h20

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