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

Persistance des données Java Discussion :

Améliorer les performances d'Hibernate


Sujet :

Persistance des données Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Points : 62
    Points
    62
    Par défaut Améliorer les performances d'Hibernate
    Bonjour à tous,

    je travaille actuellement, dans un cadre professionnel, sur un projet J2EE utilisant Hibernate pour le mapping o/r. La base de données sur laquelle je travaille contient plusieurs tables relativement similaires, contenant différents types de produits. Nous avons donc choisi de les regrouper à l'aide de la stratégie "une table par classe concrète" (http://www.hibernate.org/hib_docs/v3...bleperconcrete), laquelle est représentée par une hiérarchie de classes du côté objet.

    Après quelques petits soucis, nous avons réussi à mapper le tout pour que cela fonctionne. Malheureusement, ces différentes tables contiennent plusieurs millions de lignes chacune, ce qui a tendance à très fortement dégrader les performances d'Hibernate, étant donné que les requêtes qu'ils génèrent ne sont pas des plus rapides. Je m'explique :

    Voici un exemple (que j'ai volontairement simplifié et en partie renommé) de la requête SQL générée par Hibernate pour récupérer un ensemble de produits, contenus dans les différentes tables, mais rattachés à la même commande :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    select
    	produits0_.libelle as libelle3_,
    	produits0_.num_commande as num_commande41_2_,
    	produits0_.a_envoyer as a5_41_2_,
    	produits0_.clazz_ as clazz_2_
     
    from (
    	select
    		libelle,
    		num_commande,
    		a_envoyer,
    		1 as clazz_
     
    	from produit_1
     
    	union select
    		libelle,
    		num_commande,
    		a_envoyer,
    		2 as clazz_
     
    	from produit_2
     
    	) produits0_
     
    where produits0_.num_commande=?
    Etant donné le nombre de lignes contenues dans les différentes tables, cette requête prend plusieurs minutes pour s'exécuter (mon record doit tourner autour de 20 min !!). Ceci est dû au "select" central travaillant avec l'"union".

    En effet, il suffit de transformer la requête comme suit pour que le même résultat soit obtenu en 0,01s :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    select
    	produits0_.libelle as libelle3_,
    	produits0_.num_commande as num_commande41_2_,
    	produits0_.a_envoyer as a5_41_2_,
    	produits0_.clazz_ as clazz_2_
     
    from (
    	select
    		libelle,
    		num_commande,
    		a_envoyer,
    		1 as clazz_
     
    	from produit_1
            where num_commande=?
     
    	union select
    		libelle,
    		num_commande,
    		a_envoyer,
    		2 as clazz_
     
    	from produit_2
            where num_commande=?
     
    	) produits0_
    Etant donné que je possède le code de la requête beaucoup plus rapide, j'aurai pu l'implémenter directement dans le code et trouver un moyen de convertir les résultats dans les différentes classes concernées.

    Le problème est que cette requête est générée automatiquement lorsque Hibernate essaye de récupérer une collection de produits, appartenant à une commande en tant qu'attribut (nous avons activé l'option Lazy-loading pour limiter le nombre de données chargées). Nous n'y avons donc pas accès.

    Connaissez-vous un moyen (en mappant différemment les tables, avec une option Hibernate à activer...) d'améliorer les performances des requêtes générées automatiquement par Hibernate ou encore de donner à Hibernate les requêtes à utiliser pour les sélectionner les attributs souhaités ?

    Merci d'avance pour vos réponses,
    MiniMarch

  2. #2
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Si tu ne trouves pas il est possible de redefinir dans le mapping la requete par default généré dans le mapping pour un select, update, etc... (fichier .hbm.xml).
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2007
    Messages : 71
    Points : 62
    Points
    62
    Par défaut
    Est-ce que tu aurais un lien, ou un document quelconque en expliquant le fonctionnement ?

    Soit j'ai des moufles, soit internet est assez pauvre en informations...

  4. #4
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Citation Envoyé par minimarch76
    Soit j'ai des moufles, soit internet est assez pauvre en informations...
    Euh......
    Je dirais que internet n'est pas très riche sur ce point mais que tu es à mi chemin entre la main et la moufle

    Tiens regarde la dessus (a partir du 16.3):

    http://www.hibernate.org/hib_docs/v3.../querysql.html
    Une solution a été apporté pour résoudre votre problème alors vous aussi faites en profitez les autres grâce au tag qui se trouve tout en bas de la page....

    Merci de ne pas utiliser les messages privés pour un problème sauf si je vous l'ai explicitement demandé.

    -- Maxf1 --

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Merci bien ! C'est exactement ce que je cherchais... malheureusement, pour des raisons de temps, je n'ai pas pu la mettre en place dans notre projet. La réponse reste donc théorique, mais je pense que ça aurait pu résoudre pas mal de problème.

    Je la garde dans un coin par la suite, je pense que j'en aurai besoin.

    Merci encore.

    MiniMarch

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 4D : comment améliorer les performances ?
    Par Elriks dans le forum 4D
    Réponses: 10
    Dernier message: 05/10/2007, 11h21
  2. Optimisation de jsp pour améliorer les performances
    Par djuddju dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 01/12/2006, 05h50
  3. Réponses: 2
    Dernier message: 01/08/2006, 10h20
  4. [IW][D7] améliorer les performances
    Par Magnus dans le forum Bases de données
    Réponses: 19
    Dernier message: 11/10/2005, 20h46

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