1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : décembre 2011
    Messages : 83
    Points : 23
    Points
    23

    Par défaut Parcourir resultset en un minimum de temps

    Bonjour à tous,

    j'effectue une requête SQL qui me retourne un résultat contenant environ 50 000 lignes que je désire afficher dans une jtable.

    J'obtiens des temps d'environs 65 sec pour effectuer celà.
    Je trouve ce temps élevé et aimerai optimiser mon code.

    L'étape consommant le plus de temps (environ 60 sec) est la suivante :
    dans le Model associé à ma JTable, je stocke les données de mon ResultSet dans un ArrayList.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Resultset resultat;
     
    do
    {
     
    }
    while(resultat.next());
    En ne faisant aucun traitement dans ma boucle (uniquement next()), cette étape me prend environ 60sec.
    J'ai essayé de paramétrer le nombre de lignes à récupérer en faisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    resultat.getStatement().setMaxRows(100000);
    resultat.setFetchSize(5000);
    mais celà n'a pas changé grand chose.
    Je ferme correctement mes ResultSet, Statement, Connexion.
    J'utilise également un PreparedStatement.

    Quelqu'un aurait-il une idée pour améliorer les performances?

    Merci d'avance

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur java, .Net
    Inscrit en
    janvier 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur java, .Net

    Informations forums :
    Inscription : janvier 2011
    Messages : 56
    Points : 63
    Points
    63

    Par défaut

    Montres nous ta requête. Tu as quel index pour cette requête?

  3. #3
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    22 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2007
    Messages : 22 754
    Points : 43 175
    Points
    43 175

    Par défaut

    Chaque appel à next va créer des objets correspondants à la ligne. Si on suppose que tu n'as que 10 colonnes de type String, t'es quand même gentillement occupé de demander à java de créer et détruire 500.000 Objets. Il ne faut par regarder que le nombre de lignes mais aussi la mémoire que ça occupe.

    Vu que, en général hein, on ne sais pas afficher plus de 80 lignes à la fois à l'écran, on se demande l'intérêt de pomper 50.000 lignes d'un coup plutot que 100 lignes à la fois

    Maintenant, certes, 60 secondes c'est beaucoup, et il faudrait aussi regarder quelle quantité ça occupe sur la couche réseau. Si chaue ligne occupe 10Ko de données (avec des varchar tout plein ça chiffre vite), t'es quand même occupé de faitre transiter 500M sur le réseau
    "Tchize is always good. Tchize is just milk’s attempt at being immortal"
    faq java, cours java, javadoc. Pensez à et

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Bâtiment

    Informations forums :
    Inscription : mai 2011
    Messages : 71
    Points : 52
    Points
    52

    Par défaut

    Citation Envoyé par nddvlp Voir le message
    Bonjour à tous,

    j'effectue une requête SQL qui me retourne un résultat contenant environ 50 000 lignes que je désire afficher dans une jtable.
    Si c'est pour afficher dans une JTable, autant faire un "page à page", et récupérer tes objets par paquets de 100 à chaque changement de page.

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