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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 confirmé
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Par défaut
    Tu utilise les PreparedStatment pour tes requetes ?

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    tu pourrais mettre un bout de code avec une requête stp ?

  4. #4
    Membre averti
    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
    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 émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    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)

  6. #6
    Membre averti
    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
    Par défaut
    Ben ouais je comprends pas trop...
    Pourtant le message d'erreur est très clair...

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    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 averti
    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
    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;

+ 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