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

Hibernate Java Discussion :

Requête avec blob très lente.


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 64
    Points : 64
    Points
    64
    Par défaut Requête avec blob très lente.
    Bonjour, je dispose d'un script contenant le backup de ma base et je souhate l'exécuter. J'ai donc codé ceci :
    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
    Session session = HibernateSessionFactory.getSession();
    Transaction transaction;
    InputStream ips = new FileInputStream(backupScript); 	
    BufferedInputStream bis= new BufferedInputStream(ips);
    InputStreamReader ipsr = new InputStreamReader(bis);
    BufferedReader br = new BufferedReader(ipsr);
    String ligne;
    String sqlQuery = "";
    while ((ligne = br.readLine()) != null) {
            if (ligne.startsWith("--")) {
    	    	continue;
            }
            sqlQuery += ligne;
    	if (ligne.endsWith(";")) {
    	    transaction = session.beginTransaction();
    	    session.createSQLQuery(sqlQuery).executeUpdate();												
    	    transaction.commit();
    	    sqlQuery = "";
    	}
    }
    br.close(); 
    session.close();
    Cela fonctionne, mais c'est très très lent et me bloque Eclipse durant l'exécution. L'exécution de ce script ne prend que quelques secondes avec Mysql Administrator (5-6sec). Le problème se situe au niveau des insertions contenant des blobs. Sauriez vous où se situe le problème et comment le résoudre ?

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Points : 484
    Points
    484
    Par défaut
    1. Voici une petite optimisation rapide à tester ( pas de gestion d'erreur, pas de rollback de transaction je te laisse compléter.

    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
    Session session = HibernateSessionFactory.getSession();
    Transaction transaction;
    InputStream ips = new FileInputStream(backupScript); 	
    BufferedInputStream bis= new BufferedInputStream(ips);
    InputStreamReader ipsr = new InputStreamReader(bis);
    BufferedReader br = new BufferedReader(ipsr);
    String ligne;
    String sqlQuery = "";
    transaction = session.beginTransaction(); // démarre la transaction en début de boucle
    int i = 0; // un petit compteur de ligne;
    while ((ligne = br.readLine()) != null) {
            if (ligne.startsWith("--")) {
    	    	continue;
            }
            sqlQuery += ligne;
    	if (ligne.endsWith(";")) {
                     i++; // insertion d'une nvlle ligne
    	    session.createSQLQuery(sqlQuery).executeUpdate();												
    	    sqlQuery = "";
    	}
    	if (i  % LA_VALEUR_QUI_VA_BIEN == 0) { // la valeur qui va bien dépend de ton ficher de config hibernate ( prend la même valeur que hibernate.jdbc.batch_size
    	      session.flush();
    	      session.clear();
    	}
     
    }
    br.close();
    transaction.commit(); // termine la transaction en fin de boucle
     
    session.close();

    2. si ça ne suffit pas tu peux aussi ouvrir une transaction hibernate "stateless"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    StatelessSession session = sessionFactory.openStatelessSession();
    Transaction tx = session.beginTransaction();
    http://www.dil.univ-mrs.fr/~massat/d...tml/batch.html

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 64
    Points : 64
    Points
    64
    Par défaut
    Merci, j'ai en fait trouvé l'origine du problème ... l'option <property name="hibernate.show_sql"> était à true, et cela causait apparement des problèmes à Eclipse lors de la requête particulièrement longue ... Une fois passé à false, cela fonctionne correctement ...

    Cela dit, merci pour ces conseils, je ne m'étais pas spécialement attardé sur les détails de gestion des erreurs et de l'endroit où placer les commit etc ... J'y vais donc de ce pas

    Problème résolu donc ... Merci !

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

Discussions similaires

  1. Requête avec STRAIGHT_JOIN Trés lente
    Par ahmed. dans le forum Requêtes
    Réponses: 4
    Dernier message: 06/06/2012, 15h54
  2. Requête avec SUM très complexe
    Par maxence64 dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/12/2011, 11h18
  3. Réponses: 22
    Dernier message: 28/11/2010, 12h25
  4. boot avec DD TRÈS lent
    Par troumad dans le forum Composants
    Réponses: 40
    Dernier message: 30/01/2007, 17h11
  5. Réponses: 2
    Dernier message: 04/03/2006, 10h47

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