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 :

Passage de mysql à derby, probleme


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de japhettchabao
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2014
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Togo

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 86
    Par défaut Passage de mysql à derby, probleme
    Bonsoir, tout mon application ayant été dévéloppé avec mysql, je me vois dans l'obligation de passer à derby. Jusqu'ici tout va bien mais voici comment je gère mes tableaux sous mysql
    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
     public static void InitialiserTableau() throws SQLException {
            String query = "SELECT * FROM produits ORDER BY nom ASC";
     
            Requete rq = new Requete();
            rq.connexion();
            ResultSet resultat = rq.executer(query);
            ResultSetMetaData Mresultat = resultat.getMetaData();
            Object[] titre = {"Matricule","Nom","Marque","Categorie","Prix Unitaire","Prix D'achat"};
            resultat.last();
            Object[][] data = new Object[resultat.getRow()][Mresultat.getColumnCount()];
            resultat.beforeFirst();
            int j = 1;
            while (resultat.next()) {
                for (int i = 1; i <= Mresultat.getColumnCount(); i++) {
                    data[j - 1][i - 1] = resultat.getObject(i);
                }
                j++;
            }
            jTable1.setModel(new DefaultTableModel(data, titre));
        }
    tout marchais bien mais sous derby j'ai ces erreurs que je ne comprends pas et que je ne sais pas comment les corriger.
    sept. 24, 2015 10:07:32 PM Tg.Base.Conteneur jMenuItem8ActionPerformed
    Grave: null
    java.sql.SQLException: La méthode 'last()' est uniquement autorisée sur les curseurs de défilement.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedResultSet.checkScrollCursor(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedResultSet.last(Unknown Source)
    at Tg.Pharmacie.GestionProduits.InitialiserTableau(GestionProduits.java:36)
    at Tg.Pharmacie.GestionProduits.<init>(GestionProduits.java:26)
    at Tg.Base.Conteneur.togererproduits(Conteneur.java:89)
    at Tg.Base.Conteneur.jMenuItem8ActionPerformed(Conteneur.java:483)
    at Tg.Base.Conteneur.access$700(Conteneur.java:32)
    at Tg.Base.Conteneur$8.actionPerformed(Conteneur.java:262)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
    at java.awt.Component.processMouseEvent(Component.java:6504)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6269)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4860)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4686)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2713)
    at java.awt.Component.dispatchEvent(Component.java:4686)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:680)
    at java.awt.EventQueue$4.run(EventQueue.java:678)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
    Caused by: java.sql.SQLException: La méthode 'last()' est uniquement autorisée sur les curseurs de défilement.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
    ... 49 more
    merci d'avance

  2. #2
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Mmm, rare de voir quelqu'un qui utilise cette partie assez méconnue de l'API ResultSet : le ScrollableResultSet !

    Ton problème a deux possibilités :
    - soit derby ne supporte par les resultSet Scrollable (la capacité d'aller à n'importe quel index du ResultSet comme fist(), last(),...)
    - soit il a besoin que tu lui précises que tu veux un ResultSet Scrollable (à préciser dans ta classe Requete puisqu'apparemment c'est elle qui se charge de ça)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

    Dans le cas numéro 1, c'est mort et tu vas devoir trouver une autre façon d'initialiser ton tableau de résultat :
    - utiliser des List (ça sera plus souple)
    - faire une première requête qui fera un "count(1)" afin de connaitre le nombre de lignes

  3. #3
    Membre confirmé Avatar de japhettchabao
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2014
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Togo

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 86
    Par défaut Je vais essayer
    ok je vais essayer voir

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    une remarque quand même, ce code n'est absolument pas performant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            String query = "SELECT * FROM produits ORDER BY nom ASC";
     
            Requete rq = new Requete();
            rq.connexion();
            ResultSet resultat = rq.executer(query);
            ResultSetMetaData Mresultat = resultat.getMetaData();
            Object[] titre = {"Matricule","Nom","Marque","Categorie","Prix Unitaire","Prix D'achat"};
            resultat.last();
    Tu demande à la DB de tout lire pour atteindre le dernier row et ensuite recommencer à 0. Je ne sais pas comment ça marche avec derby, mais avec mysql cela signifiait que le driver chargeait tout en mémoire avant de commencer le parcour. Pourquoi tu ne stocke pas dans une Liste plutot qu'un tableau? Comme ça pas besoin de connaitre la taille et ca t'éviterais ce genre de bidouille qui met de la pression sur le driver.

  5. #5
    Membre confirmé Avatar de japhettchabao
    Homme Profil pro
    Développeur Java
    Inscrit en
    Septembre 2014
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : Togo

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 86
    Par défaut
    ok, je vais suivre ton conseil et m'y mettre. merci

  6. #6
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Tu demande à la DB de tout lire pour atteindre le dernier row et ensuite recommencer à 0.
    Normalement non, quand on utilise un scrollable resultset, les données ne sont pas lues, c'est la base de données qui est censée faire le travail en allant positionner un curseur au bon endroit dans les résultats (sur la base, pas en mémoire).
    (c'est d'ailleurs tout l'intérêt de l'API et de tout ce qui est RowSet).

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Sauf que toute les bases de données ne sont pas capable de "revenir en arrière" et quand on demande un resultset scrollable, dans ces cas là, c'est le driver qui fait le boulot. Je suis d'accord que dans le monde idéal, la db sera capable de faire le boulot et de ne sortir que les rows intéressant au fur et à mesure de la demande. Mais ce n'est pas le monde réel. Plus particulièrement, le driver mysql charge tout en mémoire, sauf si le statement est configuré comme ceci:

    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY

    cf http://dev.mysql.com/doc/connector-j...ion-notes.html

    Ce qui empêche du coup des appels pour se balader dans le resultset à sa guise.

Discussions similaires

  1. Erreur MySQL (Surement due au passage a MySQL 5)
    Par Syntax-ERROR dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2006, 01h19
  2. [Accent et MySQL 5] Probleme d'accent
    Par spk4ever dans le forum Installation
    Réponses: 7
    Dernier message: 09/03/2006, 12h22
  3. Besoin d'aide pour passage de mysql a sql server
    Par mobscene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/12/2005, 07h55
  4. [JDBC][Derby]Problèmes sur un runnable
    Par koko- dans le forum JDBC
    Réponses: 3
    Dernier message: 08/09/2005, 11h05
  5. passage de Mysql 3.23 a 4.1 avec php4
    Par epeichette dans le forum Installation
    Réponses: 4
    Dernier message: 09/04/2005, 21h33

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