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 :

[JDBC] Access sature...


Sujet :

JDBC Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Points : 10
    Points
    10
    Par défaut [JDBC] Access sature...
    Bonjour à tous !

    Je suis sur un projet pour mon école, et je dois utiliser une SGDB Access...
    Lors d'un traitement d'un tableau dynamique croisé, j'envoie des fois plusieurs centaines de requêtes, et j'ai un erreur qui ressemble à une saturation du driver ODBC :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.sql.SQLException: [Microsoft][Pilote ODBC Microsoft Access] Trop de tâches client.
    J'ai tenté des "tempo" entre chaque requête avec un thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try{
    Thread.sleep(2000);
    }
    catch (InterruptedException e) {
    e.printStackTrace();
    }
    Ca n'a malheureusement rien changé et ça plante toujours... Je précise que tout fonctionne parfaitement lorsqu'il n'y a pas beaucoup de requêtes à envoyer.
    Je précise également que je ne malheureusement pas passer à une SGBD plus solide du genre mysql...

    Merci d'avance !

  2. #2
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    Tu utilise les PreparedStatment pour tes requetes ?

  3. #3
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    tu pourrais mettre un bout de code avec une requête stp ?
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    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
     
            try
            {
                // On se connecte à la base de données
                Class.forName(conn);
                Connection connexion = DriverManager.getConnection(url,user,pass);
     
                // On récupère tous les enregistrements qui contient les deux variables
                Statement result = connexion.createStatement();
                result.executeQuery("SELECT "+ Variable1 +" FROM donnees WHERE " + Variable1 + " = '" + ValeurVariable1 + "' AND " + Variable2 + " = '" + ValeurVariable2 + "'");
                ResultSet ligne = result.getResultSet();
     
                int i=0;
                while(ligne.next())
                {
                    i++;
                }
     
                ligne.close();
                result.close();
                connexion.close();
     
                return i;
            }
            catch (Exception e) {e.printStackTrace();System.err.println("Erreur lors du traitement du tableau dynamique");return 0;}
    Sachant que cette fonction est relancée en boucle suivant les besoin (plusieurs dixaine, voire centaines de fois à la suite)

    [EDIT] J'oubliais de préciser les champs qui précèdent tout ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        private String connexion = "sun.jdbc.odbc.JdbcOdbcDriver";
        String url= "jdbc:odbc:Driver={Microsoft Access Driver(*.mdb)};DBQ=./Bretagne.mdb";
        private String user = "";
        private String pass = "";

  5. #5
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    normalement ça ne devrait pas être un problème de lancer 20000 requêtes comme tu fais ça en boucle et que tu close (à part en cas d'exception)

    sinon utilise plutôt des PreparedStatement (en particulier pour les String/VARCHAR)
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Ben ouais je comprends pas trop...
    Pourtant le message d'erreur est très clair...

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Si ton programme est multithread c'est surement ca le hic (access doit être limité à 5 ou 6 connexion maxi je crois).
    Sinon, je te conseillerais aussi les PreparedStatement, c'est un bien meilleur réflexe à avoir. Il est encore mieux de conserver ces objets entre 2 requètes, le gain de vitesse est alors tout sauf négligeable.
    Le must restant bien sur d'utiliser un pool de connexions, mais je me doute que tu n'as pas trop envie de te casser la tête avec ca pour un dossier.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Je viens de tenter le preparedStatement mais ça me fait la même erreur... Peut-être que je ne l'ai pas bien utilisée : 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
     
    String sql = "SELECT " + Variable1 + " FROM donnees WHERE [" + Variable1 + "] = ? AND [" + Variable2 + "] = ?";
    PreparedStatement preparedStatement = connexion.prepareStatement(sql);
     
    preparedStatement.setString(1,ValeurVariable1);
    preparedStatement.setString(2,ValeurVariable2);
     
    ResultSet ligne = preparedStatement.executeQuery();
     
    int i=0;
    while(ligne.next())
    {
          i++;
    }
     
    ligne.close();
    preparedStatement.close();
    connexion.close();
     
    return i;

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 85
    Points : 81
    Points
    81
    Par défaut pool
    Salut,

    Essayes de mettre ton objet Connexion en variable membre de la classe
    et d'utiliser la même connexion pour faire plusieurs PreparedStatements.
    Là, le problème c'est que tu te connectes et déconnectes autant de fois
    que tu appelles ta méthode... Alors si tu enchaines ca rapidement, le driver
    à peut être du mal au bout d'un moment !

    Sinon, regardes pour mettre en place un pool de connexion...
    a+
    Xavier

  10. #10
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    rien à voir mais pourquoi tu fais pas un COUNT directement dans ta requête ?
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Tu ne sembles pas avoir compris le principe du PreparedStatement.
    Si tu recomposes à chaque fois ta requete ca fout le bordel. Il faut utiliser des requetes statiques genre "select id from tableClients where nom=?", cette requete sera ensuite précompilée et pourra être réutilisée en chageant simplement les paramètres.
    A part ca, xfacq n'a peut-être pas tort. Même si tu fermes correctement tes connexions, on pourrait imaginer que le driver odbc prenne un certain temps avant de s'en rendre compte. Comme ta requete s'exécute en boucle, tu créerais alors des connexions sans laisser le temps aux anciennes de se fermer.
    Essaie de conserver ta connexion, mais n'oublie pas de fermer ton resultset. Sinon pool de connexions++.

  12. #12
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    Citation Envoyé par zais_ethael
    Il faut utiliser des requetes statiques genre "select id from tableClients where nom=?"
    ba si ta restriction se fait sur des champs que tu as en paramètre par exemple (ce qui est apparemment le cas), il faut bien que tu construises ta String de requête toi-même
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    En tout cas, merci de vous pencher sur le problème !

    Je bosse sur mon projet quasiement tout l'après midi donc je vais essayer de ne pas fermer la connexion... Je vais me renseigner aussi sur la fonction COUNT sql que je ne connais pas.

    Et si ça continue de merder, je vous demanderai certainement des conseils sur le "pool de connexions" dont je n'ai jamais entendu parlé !

    Je vous tiens au courant

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Et bien je vous remercie tous, mon souci est réglé : j'ai utilisé un preparedStatement en faisant tout mon traitement sans fermer la connexion.

    Merci encore !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/04/2006, 10h28
  2. Réponses: 1
    Dernier message: 22/12/2005, 09h03
  3. [JDBC][Access] comment faire un lien avec la BD
    Par pmartin8 dans le forum JDBC
    Réponses: 4
    Dernier message: 19/10/2005, 14h35
  4. [JDBC] access et linux
    Par romuluslepunk dans le forum JDBC
    Réponses: 7
    Dernier message: 28/05/2005, 12h30
  5. [JDBC][Access] Transaction SQL sur MS Access?
    Par Twofy dans le forum JDBC
    Réponses: 2
    Dernier message: 19/08/2004, 14h46

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