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 :

Temps d'exécution requête SQL trop Longue


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 47
    Points : 44
    Points
    44
    Par défaut Temps d'exécution requête SQL trop Longue
    bonjour
    je veux afficher dans ma table JTable touts les articles de ma BDD MYSQL qui représentent environ 4700 lignes
    pour que l'utilisateur peut faire une recherche globale grâce a un EditText donc hypothèse de plusieurs pages a écarter.
    le problème c'est que la requête prend 20 second
    et ça gène énormément
    voici le code

    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
    32
    33
    34
    35
    36
    37
     
    modeleArticle.clear();
     
     
    						Article article ;
    						try {                                                    
    			              Statement state = ArticleDAO.connect.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY );
    			              		ResultSet result = state.executeQuery("SELECT * FROM article LEFT JOIN famille_article ON id_famille_article = famille_article.id LEFT JOIN categorie_article ON id_categorie_article = categorie_article.id " 
     
    			              				                               );
     
     
    			              		while(result.next())
     
    			              		{
    						       		article = new Article(result.getInt("id"), result.getInt("n_papillon"), result.getString("code"),result.getString("gisement_secondaire"), result.getString("label"), result.getString("unite"), result.getFloat("stock"), result.getFloat("prix_unitaire"), result.getInt("rang"), result.getInt("stock_mini"), result.getDate("date_creation"),result.getDate("date_modification"), result.getString("checkout"));
     
     
     
    			              		Object[] temp = {article.getId_article(),article.getN_papillon(),article.getGisement_secondaire(),article.getCode_article(),  "",article.getLabel_article(),article.getUnite_article(),article.getStock_article(),article.getPrix_article(),article.getRang_article(),article.getStockmini_article(),article.getDate_creation(),article.getDate_modification(),article.getCheckout_article(),"","",  ""};
    			              		modeleArticle.addRow(temp);
     
     
    			              		}
     
    						} catch (SQLException e) {
    			              e.printStackTrace();
    			      }	
     
    		}
     
     
    		}	 
    		 tableauArticle.setModel(modeleArticle);
    		 calculer_total();
    		 sorter = new TableRowSorter<TableModel>(tableauArticle.getModel());
    			tableauArticle.setRowSorter(sorter);

  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
    1) c'est la requête ou l'ajout des données dans le modèle qui prend 20 secondes?
    2) si c'est la requête -> vérifier que les index sont bien créé dans mysql
    3) si c'est le transfert des données, même si c'est plus de travail, il est peut-être préférable d'utiliser un resulset scrollable et de construire un TableModel autour plutot que de tout lire et de transférer dans une modèle. Après tout, l'interface TableModel est simple et on peux sans trop de travail implémenter ces méthodes sur base d'un resultSet. L'inconvénient, c'est que tant que la table est visible, le ResultSet doit resté connecté à la db

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 47
    Points : 44
    Points
    44
    Par défaut
    c'est la requête qui prend 20 secondes donc ça concerne lecture et affichage
    quand j'ajoute LIMIT 1000 par exemple, j'ai un temps de réponse de 2s (acceptable) mais avec 4500 ligne ça prend 20s.
    après tout est dans les normes vu que j'ai mes données dans mon modèle.

    et pour l'index ça concerne juste la clé primaire of course

  4. #4
    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
    pour l'index il est important que toutes les clés utilisées par les JOIN soient soient indexée au niveau de la DB. Ensuite, si c'est la requête SQL qui prend du temps, il faut voir pourquoi ton SGBD est aussi lent à retourner ces enregistrements. (C'est aussi lent quand tu tappe cette requete dans un phpmyadmin ou dans une console mysql avec redirection vers un fichier?
    4000 entrées, c'est pas grand chosep our un SGBD par contre c'est beaucoup à gérer si tu veux les mette en mémoire coté java.

    Aussi, quel est la vitesse du lien entre le SGBD et java? Il est important d'arriver à déterminer où se trouve la lenteur.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 47
    Points : 44
    Points
    44
    Par défaut
    je pense que c'est du coté de la mémoire de java
    parce que quand je lance la requête dans Mysql ou phpmyadmin le résultat est immédiatement affiché

    il n y'a pas une solution ??

  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
    au lieu de faire des addRow un à la fois, crée un Object[][] contenant toute tes données et crée un nouveau tablemodel autour en une seule fois. Il y a fort à parier qu'à chaque addRow() la JTable refasse tous ses calculs de présentation.

  7. #7
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 47
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    au lieu de faire des addRow un à la fois, crée un Object[][] contenant toute tes données et crée un nouveau tablemodel autour en une seule fois. Il y a fort à parier qu'à chaque addRow() la JTable refasse tous ses calculs de présentation.
    je vais essayer ...............

  8. #8
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 47
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    au lieu de faire des addRow un à la fois, crée un Object[][] contenant toute tes données et crée un nouveau tablemodel autour en une seule fois. Il y a fort à parier qu'à chaque addRow() la JTable refasse tous ses calculs de présentation.

    c'est bon ça marche...........
    j'ai utilisé avant un Object[][] et crée un tablemodel autour en une seule fois.
    merci beaucoup

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

Discussions similaires

  1. [Débutant] Requête SQL Trop longue
    Par Avatar69 dans le forum C#
    Réponses: 3
    Dernier message: 14/05/2013, 18h26
  2. [MySQL] Interrompre une requête sql trop longue
    Par kayoum dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/05/2011, 14h00
  3. Probleme de requête SQL trop longue
    Par piscou51000 dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/02/2010, 19h06
  4. [Requête SQL]Trop longue pour une ligne
    Par jbulysse dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/07/2008, 14h27
  5. Réponses: 2
    Dernier message: 04/04/2006, 11h46

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