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][CONNEXION][STATEMENT][RESULTSET] comment faire ?


Sujet :

JDBC Java

  1. #1
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut [JDBC][CONNEXION][STATEMENT][RESULTSET] comment faire ?
    Voici ma problématique !!

    Je veux pouvoir charger des tuples un par un, mais une fois sur un tuple je veux pouvoir faire des next ou prev sur le result set

    Du peux que j'ai regarder il est possible de faire un next et un prev sur des resultset créé de la bonne facon

    mais c'est au niveau du statement que mes questions commence,
    Une fois une requete effectuer, un statement est fermé, moi j'aimerais au final pouvoir creer un statement et executer une requete du type
    SELECT * FROM matable
    puis recuperer le ResultSet
    ne pas fermer le statement et ainsi pouvoir relancer un requete du type
    SELECT * FROM matable WHERE CLE = maclé
    mais que ca ne fasse que déplacer mon curseur du resultset sur le bon tuple
    ainsi je peux toujours faire des next & prev

    bref, de ce que j'ai vu, tout ceci n'est pas faisables, puisque le statement est fermé

    mais peut-être connaissez vous un moyen d'arriver à peu prés au même résultat sans faire de grosses requete bourrine tout le temps
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  2. #2
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    personne n'a une idée de comment faire ?
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Salut,
    Première question : algoritmiquement, qu'est ce que tu souhaites faire ? Si c'est ce que je pense (il y a un ou plusieurs champs dans ta table qui contiennent une clé étrangère pointant vers la meme table ; par exemple une personne qui a un manager), tu dois pouvoir le faire en SQL.
    Parce que franchement, aller et revenir dans un ResultSet, c'est pas beau...

  4. #4
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    c pas tout a fait ca, disons que j'ai un programme dans lequel il peut rentrer le code d'une fiche
    je charge donc cette fiche,
    mais l'utilisateur peut demander la fiche suivante, ce qui est le prochain record du resultSet qui serait fait par un select qui prendrait tout.
    Et en plus de ca, l'utilisateur peut demander l'enregistrement precedent

    Je pensais en fait avoir un statement qui serait liés a un resultset "select * from matable" et j'aimerais finalement que lorsque je fais une requete précise avec un autre statement, repositionner le curseur sur mon premier par rapport au resultset du deuxieme.

    Je ne suis peut-être pas trés clair, mais ce que je veux faire c permettre a l'utilisateur de faire de NEXT / PREV mais de facon "propre" pour la base de données.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Est ce qu'il s'agit d'une application client-serveur ? Combien d'utilisateurs simultanés ?

  6. #6
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    client-serveur : oui via J2EE
    dimensionnement : 10 à 100 clients simultanés pour le moment.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    En client serveur (HTML => mode déconnecté) j'aurais plutot tendance a ne pas laisser trop de connexions (et à plus forte raison de resultset) ouvertes (sauf pour des transactions complexes)...
    A la limite, tu peux retourner une liste de fiches dans la session (a condition qu'il n'y en ait pas des milliers...) et tu recharges ta jsp a chaque fois (elle se rappelle elle meme avec l'identifiant de la fiche). Mais s'il y a beaucoup d'enregistrement, et etant donné qu'il n'est pas sûr que l'utilisateur clique sur le bouton "fiche précédente" ou "fiche suivante", je trouverais plus propre de faire une nouvelle requête à chaque fois.

  8. #8
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    c bien en mode deconnecté mais pas pour le WEB
    le client est une application pur JAVA je ne passe pas par des conteneurs WEB genre struts etc..

    je n'utilise que les EJBs.

    ceci dit, je suis d'accord sur l'idée de ne pas trop laisser de connection;
    mais comment refaire une requete qui va me donner l'enregistrement suivant ?
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Ca dépend de comment sont identifiées tes fiches (comment on peut connaître l'identifiant de la fiche suivante).
    Si le client peut déterminer tout seul cet identifiant, il renvoie une demande toute simple au serveur (retourne moi la fiche d'id = ...).
    Sinon tu peux faire retourner au serveur (en plus de la fiche) l'id de la fiche suivante et l'id de la précédente et les placer dans les liens "fiche précédente" et "fiche suivante".

  10. #10
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Merci de te pencher sur mon probleme

    Je ne peux connaitre a l'avance le code de la fiche precedente ou celui de la fiche suivante (ce doit être le "vrai" NEXT/PREV suivant la clé primaire)

    Donc comment faire pour recuperer en une requete 3 tuples (celui demandée, celui juste avant et celui juste apres) ????

    Je sens que ca va être le bordel ce truc

    Citation Envoyé par Greedo
    Ca dépend de comment sont identifiées tes fiches (comment on peut connaître l'identifiant de la fiche suivante).
    Si le client peut déterminer tout seul cet identifiant, il renvoie une demande toute simple au serveur (retourne moi la fiche d'id = ...).
    Sinon tu peux faire retourner au serveur (en plus de la fiche) l'id de la fiche suivante et l'id de la précédente et les placer dans les liens "fiche précédente" et "fiche suivante".
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  11. #11
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    bump.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Je suppose que la notion de précédent/suivant est déterminé par la requête SQL (order by, etc). A la limite, tu peux faire une requête SQL globale a chaque fois (ok, c'est pas terrible, mais si tu ne peux connaître la fiche précédente et la suivante que par le ResultSet on n'a pas bien le choix...) et tu procèdes de la manière suivante :
    - tu parcours ton ResultSet
    - dès que tu tombes sur le tuple "central" recherché, tu crées un bean pour ta fiche
    - avec .next() et .previous() tu récupères juste les clés de tes fiches précédente et suivante ; tu stockes alors ces clés grâce aux attributs "idFichePrec" et "idFicheSuiv" que tu auras judicieusement créés dans ton bean Fiche
    - tu retournes ton bean Fiche a ta JSP
    - dans ta JSP tu affiches bien entendu le contenu de ton bean + tu positionnes dans les liens "precedent" et "suivant" les nouvelles clés

    Le seul défaut de cette méthode réside dans l'exécution d'une requete globale a chaque fois. Apres, en fonction des contraintes techniques et fonctionnelles de ton appli, tu dois pouvoir arriver a customiser ta requete afin de restreindre le nombre de valeurs retournées. Sinon tu peux aussi exécuter 2 requêtes SQL : une qui retourne le tuple de ta fiche, l'autre qui ne retourne que les clés ordonnées dans l'ordre qui t'intéresse. Avec la premiere tu remplis ton bean et avec la seconde, bien entendu, tu chopes les id des fiches précédente et suivante. L'avantage de cette méthode est que tu retournes moins de données (la super requete globale te fait retourner un ResultSet enooooorme).

  13. #13
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    j'essai de reflechir a ce probleme

    au final, voici une piste que j'envisage

    Nombre de requetes: 3 !!

    - 1ere : requete direct sur le tuple demandée
    - 2eme : requete pour le prev
    --> retour d'un resultSet avec tout les records AVANT
    --> je place le curseur en "last"
    --> je fais UN prev
    - 3eme : requete pour le next
    --> retour d'un resultSet avec tout les record APRES
    --> je fais un next

    Le seul truc, c'est que j'ai un peu de mal a automatiser la requete SQL pour la 2 et la 3 (car j'écris un EJB de requetage qui construit la requete en fonction de données qui me sont propres)
    Disons que je posséde la liste des champs faisant partie de la "clé" sur laquelle on travaille (dans notre cas, c'est plus un tri)

    Ensuite, je n'arrive pas rééllement a évaluer dans le cas où j'arrive a mettre en ouvre cette méthode si elle est suffisamment efficace !!

    bref, ce n'est pas mon domaine de predilection le BD,
    Ce qui me chiffone, c'est qu'il me semble que ca doit être un probleme récurrent, je dois pas être le seul a vouloir le record juste avant mon record courant !!
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Pour améliorer les perfs, essaie de limiter le nombre de tuples et de champs retournés.
    Tiens moi au courant de l'avancement de ton étude...

  15. #15
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    bon voila, j'ai écris un systeme qui genere mes requetes de chargement de next et prev, ca fonctionne avec des perfs raisonnables.

    je ne vais pas détailler le moteur car y a tout un existant de l'applic a expliquer en même temps. Mais je donne la requete qu'il genere pour un next et un prev.

    admettons la table myTable avec la primary key composée des champs K1,K2 et K3

    et que je suis sur le tuple "TOTO", "TATA" , "TITI"

    Le NEXT est généré de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * FROM myTable 
    WHERE 
        ( K1 > 'TOTO' )
    OR  ( K1 = 'TOTO' AND K2 > 'TATA' )
    OR  ( K1 = 'TOTO' AND K2 = 'TATA' AND K3 > 'TITI')
    ORDER BY K1 ASC, K2 ASC, K3 ASC
    FETCH 1 ROWS ONLY
    Le PREVIOUS est généré de cette façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * FROM myTable 
    WHERE 
        ( K1 < 'TOTO' )
    OR  ( K1 = 'TOTO' AND K2 < 'TATA' )
    OR  ( K1 = 'TOTO' AND K2 = 'TATA' AND K3 < 'TITI')
    ORDER BY K1 DESC, K2 DESC, K3 DESC
    FETCH 1 ROWS ONLY
    Voilà...

    C'est suffisament efficace puisque le resultSet n'est que d'un tuple (celui demandé)
    ce qui fait que mon serveur J2EE peut liberer la connexion.
    et je ne fais la requete que si nécessaire.

    Au final la requete peut sembler un peu bourrine :-)
    mais bon elle est généré par un moteur de requetage alors on s'en fou

    Merci a ceux qui m'ont aidé sur ce probleme.
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Ah ok, tu avais en plus une clé complexe... ta solution me parait séduisante, ca limite le nombre d'infos transmises.
    Merci du retour et bonne continuation

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/06/2013, 14h07
  2. [NetBeans] comment faire la connexion jdbc ?
    Par questionneuse dans le forum NetBeans
    Réponses: 3
    Dernier message: 09/05/2006, 18h11
  3. comment faire la connexion (SQLServer) avec server MSDE(LAN)
    Par BRAHIMI MOUSSA dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2006, 13h45
  4. [JDBC][Access] comment faire un lien avec la BD
    Par pmartin8 dans le forum JDBC
    Réponses: 4
    Dernier message: 19/10/2005, 14h35
  5. Réponses: 7
    Dernier message: 21/04/2005, 15h55

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