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 :

Problème pour l'execution d'une requete de type SELECT


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut Problème pour l'execution d'une requete de type SELECT
    Bonjour,

    J'ai créé un programme java qui se connecte à une base de données distante. J'ai deux petits problèmes :

    - Lorsque je fais une requete du type SELECT *, le temps pour executer cette commande en java est de plus de 2min. (Qu'il y ait 1 000 ou 100 000 lignes)

    Y a t-il un moyen d'accélerer cette commande ? Quand je l'execute dans le logiciel qui gère la base de données, il faut à peine 1 seconde.

    - Lorsqu'il y a plus de 2 millions de lignes, il y a une erreur OutOfMemoryError. Un résultset n'est pas censé garder qu'un bloc de lignes en mémoire ?

    Merci

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    On pourrait voir ton code...


    a++

  3. #3
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    Je mets juste la partie du code pour la connection à la base de données :

    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
     
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    System.out.println("Driver charge !!");
     
    conn = DriverManager.getConnection("jdbc:mysql://ip:port/DB", "login", "mdp");
    System.out.println("Connexion etablie !!");
     
    for (int ii = 0; ii<300; ii++) {
     
                String queryString = "SELECT `Code` FROM `data` GROUP BY `Code` ORDER BY `Code` LIMIT ?,?";
     
                PreparedStatement statement = conn.prepareStatement( queryString );
                statement.setInt(1, 1000*ii);
                statement.setInt(2, 1000*ii+999);
     
                resultat = statement.executeQuery();
                System.out.println("Requete OK !!");
     
                //Traitements sur le résultat de la requete
    }
    A chaque fois que j'appelle la méthode executeQuery(), il faut environ 2 à 3 min pour passer à la suite du code.

    J'ai fait une boucle pour essayer de contourner le problème de OutOfMemory, pour ne pas charger tous les enregistrements d'un coup.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Est-ce que tu fermes bien les différents éléments (statement, resultset) ?

    a++

  5. #5
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Par défaut
    Merci beaucoup pour tes réponses très rapides.

    Effectivement, je viens de vérifier, je ne les fermais pas... De plus, en relisant mon message, je me suis aperçu que je triais les enregistrements à chaque fois que j'executais la requete (ORDER BY) ... Sur une base de données de plusieurs millions de lignes, ça prend tout de suite du temps... Un problème de réglé.


    Sinon maintenant, question rapidité, vaut-il mieux utiliser une boucle avec un LIMIT dans la requête, ou plutôt faire un SELECT * pour sélectionner tous les enregistrements en une seule fois ? A condition bien sur que je trouve d'où vient cette erreur de OutOfMemory ..

    Merci encore pour tes réponses !

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par istaccr Voir le message
    De plus, en relisant mon message, je me suis aperçu que je triais les enregistrements à chaque fois que j'executais la requete (ORDER BY) ... Sur une base de données de plusieurs millions de lignes, ça prend tout de suite du temps... Un problème de réglé.
    Si tu as un index sur le champs cela ne devrait pas être si couteux je pense...


    Citation Envoyé par istaccr Voir le message
    Sinon maintenant, question rapidité, vaut-il mieux utiliser une boucle avec un LIMIT dans la requête, ou plutôt faire un SELECT * pour sélectionner tous les enregistrements en une seule fois ?
    Si tu veux récupérer tous les éléments je ne vois pas trop l'intérêt d'utiliser une boucle avec des LIMITs...

    Citation Envoyé par istaccr Voir le message
    A condition bien sur que je trouve d'où vient cette erreur de OutOfMemory ..
    Il faudrait voir le stacktrace complet de l'exception...


    Sinon, quels traitements tu fais sur le résultat de la requete ?


    a++

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

Discussions similaires

  1. Sorte de if dans une requete de type select
    Par shaun_the_sheep dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/04/2010, 17h55
  2. problème de l'execution d'une requete
    Par azräel dans le forum VB.NET
    Réponses: 12
    Dernier message: 02/06/2009, 08h21
  3. probléme execution d'une requete
    Par sarah_s dans le forum C#
    Réponses: 5
    Dernier message: 30/05/2007, 17h21
  4. Réponses: 2
    Dernier message: 10/05/2007, 17h07
  5. Réponses: 2
    Dernier message: 20/04/2006, 14h33

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