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 :

[Oracle] Accès concurrent à une base de données


Sujet :

JDBC Java

  1. #1
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut [Oracle] Accès concurrent à une base de données
    Bonjour à tous,
    Je bosse avec Java 5.0 et Oracle 8.1.7 (driver jdbc : thin) et voici mon problème :
    Dans mon appli, j'ai un panel avec un "requêteur SQL". Entendez par là que c'est un JTextArea et que quand on clique sur un bouton exécuter, ça lance la requête et affiche les éventuels résultats dans une JTable.
    Le problème c'est que quand je lance une requête et que je change de panel, une nouvelle requête est exécutée alors que la 1ère est encore en cours, et ça plante. Chaque requête est exécutée dans un nouveau thread.

    Explications :
    Dans les 2 panels où les requêtes sont exécutées, je lance la requête par la méthode suivante, Database.executeQuery( String query ) :
    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
     
        public ResultSet executeQuery( String sql )
        {
            synchronized (stmt) 
            {
                // Exécution de la requête
                ResultSet rs = null ;
                try {
                    rs = stmt.executeQuery(sql) ;
                } catch (SQLException e) {
                    return null ;
                }
     
                return rs ;    
            }
        }
    stmt est un objet Statement, variable de la classe Database. Le " synchronized (stmt) " ne devrait il pas mettre en attente les autres threads ?

    Merci pour votre aide, je débute en JDBC et multi threading. On n'apprend que les bases en cours, pas les techniques de programmations... j'ai donc sûrement beaucoup de mauvaises habitudes !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 75
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par schniouf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public ResultSet executeQuery( String sql )
        {
            synchronized (stmt) 
            {
    ..
            }
        }
    Est tu sur de ne pas avoir 2 instances de ton objet Database ? (ta méthode n'est pas statique)

    Louis

  3. #3
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Oui je suis sûr, j'accède à mon objet Database via "Main.getDatabase()", qui d'ailleurs est elle aussi déclarée synchronized :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	public static synchronized Database getDatabase() {
    		return database;
    	}
    Dans mon code je lance donc une requête en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ResultSet rs = Main.getDatabase().executeQuery("SELECT * FROM maTable") ;

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 75
    Points : 83
    Points
    83
    Par défaut
    D'apres ce que je crois comprendre tes requetes sont executé l'une après l'autre mais dans le même Statement. Le conflit doit être à ce niveau.

    Pour faire propre il faut aussi bien penser à fermer tes ResultSet et Statement.

    Louis

  5. #5
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Dac, je vais essayer d'utiliser plusieurs Statement.
    Et sinon t'en fais pas, je ferme toujours toutes les ressources .
    Merci

  6. #6
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Re salut,
    Voilà j'ai procédé à toutes les modifications, en créant un statement et un resultSet pour chaque requête, et ça plante encore. Avec un autre message d'erreur cette fois ci. Voici le fichier de log que je génère avec mon appli, dans l'ordre décroissant de l'apparition des évènements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    29/09/06-15:21:06        ERROR          Database.closeStatement() : Erreur SQL | ErrorCode : 17002 | SQLState : null | Exception d'E/S: Violation de protocole
    29/09/06-15:21:05        ERROR          Database.createStatement() : Erreur SQL | ErrorCode : 17002 | SQLState : null | Exception d'E/S: Violation de protocole
    29/09/06-15:21:05        ERROR          Database.closeResultSet() : Erreur SQL | ErrorCode : 17002 | SQLState : null | Exception d'E/S: Violation de protocole
    29/09/06-15:21:05        ERROR          Database.createStatement() : Erreur SQL | ErrorCode : 17002 | SQLState : null | Exception d'E/S: Violation de protocole
    29/09/06-15:21:05        ERROR          OracleGEDTable.loadPrimaryKey() : Erreur SQL | ErrorCode : 17002 | SQLState : null | Exception d'E/S: Violation de protocole
    29/09/06-15:21:05        ERROR          Database.createStatement() : Erreur SQL | ErrorCode : 17412 | SQLState : null | La longueur du type est supérieure à la valeur maximale
    29/09/06-15:21:05        ERROR          QueryExecutionWorker.doInBackground() : Erreur SQL | ErrorCode : 17002 | SQLState : null | Exception d'E/S: Violation de protocole
    29/09/06-15:21:03        OK             Requête éxécutée : Database.executeQuery() : select * from WORGHST
    Database.createStatement() fait renvoie juste un connection.createStatement().

    QueryExecutionWorker.doInBackground() est un SwingWorker dans lequel j'effectue ma grosse requête (select * from WORGHST - 5000 lignes dans la table WORGHST).

    OracleGEDTable.loadPrimaryKey() est une fonction dans laquelle j'effectue une petite requête sur la base pour connaître la clé primaire d'une table. C'est au moment où je lance cette requête que tout plante.

    On peut voir que la requête lourde (select * from WORGHST) a déjà été exécutée au moment où je lance l'autre. Juste après l'éxécution, je fais une boucle sur le resultSet pour tout mettre dans un tableau, et c'est pendant ce traitement que ça plante

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 75
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par schniouf
    Erreur SQL | ErrorCode : 17002 | SQLState : null | Exception d'E/S: Violation de protocole
    Cela semble pas trés bon

    Une recherche ORA-17002 sur google et tu te sentira moins seul

    Apparement ta config ne supporte pas l'ouverture de pluseurs statement simultanés ?.

    Regarde la page suivante pourra peut être t'aider : http://www.websina.com/bugzero/kb/or...onnection.html

    Bon courrage,
    Louis

  8. #8
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Re re salut,
    J'ai trouvé d'où vient le problème. Le problème vient d'un champ qui est de type LONG. Apparemment, le fait de faire une requête de sélection sur un de ces champs plante parfois si on ne les place pas en dernière position dans les colonnes du ResultSet... trop bizarre.

    "Stream has already been closed
    If you fetch LONG or LONG RAW data in the wrong order you can get the
    SQL Exception "Stream has already been closed".
    So I've put the LONG field in the last place in the list of fields of my
    query and it works !
    Sources :
    http://mail-archives.apache.org/mod_....apache.org%3E
    http://mail-archives.apache.org/mod_...teamlog.com%3E

    Je n'ai pas testé le champ de type LONG en dernière position, mais avec une requête select * sur une table ne comportant pas de champ de ce type, je n'ai aucun soucis.

    Bref, merci à tous pour votre aide

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 75
    Points : 83
    Points
    83
    Par défaut
    Etonnant !

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 15/12/2006, 18h18
  2. [Interbase] accée a une base de donnée Distant
    Par touhami dans le forum Bases de données
    Réponses: 6
    Dernier message: 11/06/2006, 11h49
  3. Accés a une base de donnée sous trouvant sur un PC distant
    Par haganidjamel dans le forum Connexion aux bases de données
    Réponses: 2
    Dernier message: 15/03/2006, 09h38
  4. Réponses: 13
    Dernier message: 11/08/2004, 11h06
  5. [EJB] Accès concurrents à la base de données
    Par cameleon2002 dans le forum Java EE
    Réponses: 10
    Dernier message: 23/09/2003, 11h31

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