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 :

Blocage lors d'une requete


Sujet :

JDBC Java

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut Blocage lors d'une requete
    Hello,

    J'ai une application qui intéragit avec une database via une classe gérant la connexion et l'execution des requetes. En gros, j'execute toutes les requetes via cette classe, qui, lors de sa construction, crée une instance de Connexion stockée en tant que variable d'instance telle que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class DBManager {
        private Connexion conn ;
        (...)
        public DBManager(String ip, String name, String user, String passwd) {
                 this.conn = DriverManager.getConnection("jdbc:mysql://"+ip
                                              +"/"+name+"?user="+user
                                              +"&password="+passwd
                                              +"&relaxAutoCommit=true");
        }
        (...)
    }
    Ensuite, pour executer un SELECT par exemple, ca se fait via la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public ResultSet selectQuery(String query) throws SQLException {
        stmt = this.conn.createStatement();
        ResultSet rs = stmt.executeQuery(query);
     
        return rs;
    }
    Après avoir lancé mon appli (et donc déjà réalisé un certain nombre de requetes avec succès), celle ci se bloque lors de l'execution d'une nouvelle requete via. la méthode présentée ici. Le déroulement s'arrete à executeQuery.. Plus rien ensuite.

    La query est du type "insert into table(..) values(...) ; SELECT @@IDENTITY AS 'new_id' ", et s'execute corrèctement lorsque je la lance dirèctement dans mysql...

    Donc voilà, ca ressemble à un interblocage, peut être due à la manière dont sont gérés l'execution des requetes, les connexions, les statements etc... Notamment, je me demandais si un seul objet Connexion est suffisant, ou si il ne fallait pas en créer un à chaque requete (comme j'ai déjà pu voir dans certains autres programmes...)

    Bref, avez vous une idée?
    Merci d'avance...

  2. #2
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Hello,

    Pour des bases ayant un nombre important de transactions, au lieu de créer des connexions par DriverManager, il vaut mieux utiliser "Connection Pool" avec DataSource dont les propriétés peuvent être spécifiées avec JNDI. Si tu utilises le serveur Tomcat, sur le site il y a un document qui explique comment il fautl procéder.

    http://tomcat.apache.org/tomcat-4.1-...les-howto.html

    Sinon sur le web il y beaucoup de documents pour chaque type de serveur et base de données.


  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Ok je vais voir, mais en soit, n'avoir, pour un utilisateur se connectant à la BD, qu'un seul objetc Connexion à partir duquel on crée tous les statements ne pose aucun problème? Car j'ai vu l'inverse: une connexion par requête... Ca me semblait une erreur mais n'étant pas très expérimenté en JDBC...

  4. #4
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Citation Envoyé par vinzzzz Voir le message
    Ok je vais voir, mais en soit, n'avoir, pour un utilisateur se connectant à la BD, qu'un seul objetc Connexion à partir duquel on crée tous les statements ne pose aucun problème? Car j'ai vu l'inverse: une connexion par requête... Ca me semblait une erreur mais n'étant pas très expérimenté en JDBC...
    Oui, c'est intéressant le point que tu viens d'évoquer. D'après API de Sun (http://java.sun.com/javase/6/docs/api/):

    By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    En tout cas pour mon problème, dans la mesure ou je lance mes calculs dans un SwingWorker et que je n'avais pas récupéré les exceptions générées, j'avais l'impression d'un simple blocage...

    Une fois les exceptions affichées, j'ai pu constater que la méthode executeQuery n'est pas utilisable pour un insert (il y a quelques années je crois me souvenir que ca fonctionnait), contrairement à la méthode executeUpdate... Du coup j'ai splitté ma requete en deux, insert + récupération du dernier ID inséré.

    Bref, problème réglé.
    Merci de tes précisions en tout cas

  6. #6
    Membre expérimenté Avatar de dariyoosh
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 236
    Par défaut
    Citation Envoyé par vinzzzz Voir le message
    ... j'ai pu constater que la méthode executeQuery n'est pas utilisable pour un insert
    Ah oui c'est vrai, merci pour cette remarque, je n'ai pas fait attention à ça

    Bon courage!

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

Discussions similaires

  1. probleme lors d'une requete sql (controle non activé)
    Par junty dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/09/2005, 16h45
  2. Erreur lors d'une requete insert into.. select
    Par Mr N. dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/11/2004, 18h32
  3. Réponses: 3
    Dernier message: 06/07/2004, 11h21
  4. Réponses: 13
    Dernier message: 10/05/2004, 17h49
  5. Erreur lors d'une requete INNER JOIN
    Par k-lendos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/03/2004, 16h09

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