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 :

hibernate et JPA toplink


Sujet :

Persistance des données Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut hibernate et JPA toplink
    Bonjour la communauté,

    Je suis entrain de tester hibernate et topLink en stage, je voudrais avoir des chiffres de performance de ces 2 technos. J'ai une simple table track(int id, int x, int y, DateTime date) sous MySQL5. Pour faire un update de 1000 lignes je met entre 218ms et 234 ms avec toplink et 340 ms avec hibernate. J'utilise une machine pas mal, 8 coeurs et j'ai mis mon HeapSpace à 1024M. Ces chiffres me paraissent pas raisonnables, quand pensez-vous? Quelqu'un peut-il me dire quels seraient les meilleurs résultats qu'on puisse espérer. Ci-dessous ma méthode lente version topLink:
    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
    28
    29
    30
    31
     
    public void updateTracksList(ArrayList<Track> listToUpdate) {
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            int newX,newY;
            List<Track> tracksList = null;
            Timestamp lastupdatedate;
            tracksList = em.createQuery("select t from Track t").getResultList();
            int i=0;
            for(Track track:tracksList){
                newX = Math.abs(((new Random()).nextInt(10000)));
                newY = Math.abs(((new Random()).nextInt(10000)));
                lastupdatedate=new Timestamp(new Date().getTime());
                track.setX(newX);
                track.setY(newY);
                track.setLastupdatedate(lastupdatedate);
                //em.flush();
                /*
                if(i % 100 == 0){
                    em.flush();
                }
     
                */
     
                i++;
     
            }
     
            tx.commit();
     
        }
    remarque: le flush par paquet augmente le temps d'exécution: bizarre.

    Merci d'avance.

  2. #2
    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
    Il faut aussi parametrer la propriété (sous Hibernate) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <property name="hibernate.jdbc.batch_size">30</property>
    La valeur de la propriété doit être en rapport avec le nombre d'éléments que tu veux flusher (100 dans ton code).
    Il me semble que la valeur max conseillée est de 35 ou quelque chose comme ça.
    Va voir la doc, il y a un chapitre là dessus.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse j'ai mis mon batch à 20 et je fais du flush et clear par paquet de 20 comme l'indique la doc d'hibernate, mais je passe de 340ms à 375ms, je comprends pas pour cette optimisation a un effet négatif. Par ailleurs t'aurait pas une idée des performances qu'on peut espérer avec toplink pour modifier 1000 lignes. Ci-dessous les properties de mon fichier de config:
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.batch_size">20</property>
    <property name="hibernate.cache.use_second_level_cache">false</property>
    <property name="org.hibernate.flushMode">MANUAL</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
    <property name="current_session_context_class">thread</property>
    Merci encore.

  4. #4
    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
    Cela te semble trop lent ?

    Et si tu modifies ces lignes directement en SQL à partir d'un outil comme toad ou autre, les temps sont ils beaucoup plus rapides ?

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse, en effet je trouve que c'est lent puisque j'ai ecris une procédure stockée (sous mysql 5) qui modifie les 1000 lignes de la table, et le temps d'exécution est 0.00 seconde sur le terminal de MySQL, je sais pas comment afficher les autres décimales (ou le résultat en ms, si quelqu'un sait je veux bien savoir aussi), en tout cas au pire ça fait 0.009 secondes soit 9ms << 340 ms je trouve. Aussi j'ai bien vérifier que modifier 1000 tracks de mon arrayList met 0 ms c'est donc le temps de sauvegarde dans la BD qui est long.

  6. #6
    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
    Il faut bien voir que l'utilisation d'un ORM (hibernate, toplink ou autre) implique un surcout.
    Si tu as bien lu la doc et le chapitre 13 concernant le traitement par paquet, je ne pense pas que tu puisses faire beaucoup mieux.

    Tu peux toujours essayer d'écrire du JDBC pur ou tout du moins une requete SQL via Hibernate pour tes mises à jour pour voir ce que cela donne.

Discussions similaires

  1. (JPA/Hibernate) ou (JPA/TopLink)
    Par sakli dans le forum JPA
    Réponses: 11
    Dernier message: 31/01/2009, 15h43
  2. Réponses: 3
    Dernier message: 18/06/2008, 10h49
  3. [Data] integration spring jpa toplink jboss
    Par jpclavery dans le forum Spring
    Réponses: 1
    Dernier message: 23/04/2008, 11h41
  4. Besoin tutoriel JPA/TopLink/NetBeans
    Par younesoub dans le forum JPA
    Réponses: 4
    Dernier message: 13/02/2008, 18h20
  5. Hibernate - EntityNotFoundDelegate - JPA
    Par bubu56 dans le forum Glassfish et Payara
    Réponses: 1
    Dernier message: 22/10/2007, 15h57

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