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 :

gestion de base de donnees


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2003
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 128
    Par défaut gestion de base de donnees
    Bonjour,
    supposons que je veux recuperer dans un ResultSet, 100000 enregistrements d une table qq de ma base de donnees, dans ce cas vu le nombre important des enregistrements(100000), pe etre qu il y aura une saturation memoire. pour cela est ce qu il y a un moyen de s enfuir de la stauration memoire ou bien, au lieu de recupeprer dans un seul coup les 100000 enregistrements, est ce qu on pe recuperer par lot les 100000 enregistrements.
    Merci

  2. #2
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 111
    Par défaut
    Tu peux utiliser dans tes requetes l' "operateur" LIMIT.
    Il n'est pas traité toujours de la meme maniere selon les SGBD. (a verifier dans la section du forum sgbd)

    Sinon en pratique, je n'ai pas rencontré de limite ou de ralentissement trop important sur des requetes renvoyants enormement de resultat.

  3. #3
    Membre éprouvé
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Par défaut
    Bonjour,

    LIMIT si je ne m'abuse, est proprio MYSQL.
    Si tu ne veux pas rendre ton code dépendant d'un SGBD utilises plutôt la méthode setMaxRows (int) de l'interface Statement.

  4. #4
    Membre confirmé
    Inscrit en
    Août 2003
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 128
    Par défaut comment recuperer les autres enregistrements
    Bonjour,
    oui j ai essaye avec LIMIt et c etait bien marche, mai il me reste un probleme c comment recuperer le reste des enregistrements.

  5. #5
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    java.sql.Statement méthode setFetchSize(nombreRes)

  6. #6
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Effectivement tu as deux façons de le faire, soit en propriétaire MySQL, soit en générique Java.

    Dans le premier cas, LIMIT peut prendre deux nombres derrière qui sont le dans l'ordre le numéro de départ puis le nombre d'enregistrements à récupérer.

    Dans le second, setFetchSize et setMaxRows permettent de définir les deux nombres en question.

    Avantages et inconvénients des deux méthodes ?
    Dans un cas tu es dépendant de la base et pas dans l'autre. Mais dans le cas où tu es dépendant tu peux aussi récupérer le nombre d'enregistrements au total sans avoir pour cela besoin de faire une requête de count séparée (voir doc MySQL (SQL_CALC_FOUND_ROWS))

  7. #7
    Membre confirmé
    Inscrit en
    Août 2003
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 128
    Par défaut toujours la meme chose
    Bonsoir,
    j ai essaye aussi la methode setFetchSize, mai toujours la meme chose, puisqu il selectionne seulement qq enregistrements et non pa la totalite des enregistrements. par exemlpe si je lance une requete dans une table intitule element la requete sera donc "select * from element", et supposons que le resultat retourne sera 200 enregistrements.
    comment je pe utilise limit, pour visiter 20 à 20 les 200 enregistrements.
    Merci.

  8. #8
    Membre confirmé
    Inscrit en
    Août 2003
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 128
    Par défaut toujours la meme chose
    Bonsoir,
    j ai essaye aussi la methode setFetchSize, mai toujours la meme chose, puisqu il selectionne seulement qq enregistrements et non pa la totalite des enregistrements. par exemlpe si je lance une requete dans une table intitule element la requete sera donc "select * from element", et supposons que le resultat retourne sera 200 enregistrements.
    comment je pe utilise limit, pour visiter 20 à 20 les 200 enregistrements.
    Merci.

  9. #9
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Avec limit tu fais une première fois ta requête limit 0,20 puis une seconde fois avec 20,20 puis encore avec 40,20 etc... jusque 180,20
    Voir http://dev.mysql.com/doc/refman/5.0/fr/select.html

  10. #10
    Membre éprouvé
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Par défaut
    Re,

    j ai essaye aussi la methode setFetchSize, mai toujours la meme chose, puisqu il selectionne seulement qq enregistrements et non pa la totalite des enregistrements.
    Tu peux mettre ton code ? Parce qu'au pire il devrait ne pas tenir compte du paramètre et tt te retourner. Ca me semble étonnant qu'il tronque le resultSet.

    Avec limit tu fais une première fois ta requête limit 0,20 puis une seconde fois avec 20,20 puis encore avec 40,20 etc... jusque 180,20
    C'est exactement ce que tu vas obtenir en utilisant setFetchSize ().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Connection c;
    Statement s;
    ResultSet rs;
    String query;
    int fetchSize;		
    [...]
    fetchSize = 3;
    c = DriverManager.getConnection (...);
    s = c.createStatement (...);
    s.setFetchSize (fetchSize);
    query = "SELECT * FROM Table1;";
    rs = s.executeQuery (query);
    [...]
    chaque fois que tu as besoin d'afficher 1 nvelle page, tu n'appelles pas executeQuery (), mais tu appelles 1 méthode de ce genre là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ( i < fetchSize)
    {
    	while ( i++ < fetchSize && rs.next ())
    	{
    		System.out.println (rs.getDate (1));
    	}
    }
    Pour l'exemple j'ai mis la même valeur à ce qui est ''affiché'' et a fetchSize parce qu c'est plus logique, mais il n'y a aucune obligation. 1 nouveau bloc sera chargé à chaque fois que la classe aura consommé ttes les lignes du précédent.
    Physiquement ça se traduit par 1 série d'échanges comme ça. On voit bien que seulement 3 records sont retournés à chaque fois.
    handler=org.postgresql.jdbc2.AbstractJdbc2Statement$StatementResultHandler@1fcf0ce,maxRows=0, fetchSize=3, flags=9
    FE=> Parse(stmt=S_2,query="SELECT * FROM Table1",oids={})
    FE=> Bind(stmt=S_2,portal=C_3)
    FE=> Describe(portal=C_3)
    FE=> Execute(portal=C_3,limit=3)
    FE=> Sync
    <=BE ParseComplete [S_2]
    <=BE BindComplete [C_3]
    <=BE RowDescription(2)
    <=BE DataRow
    <=BE DataRow
    <=BE DataRow
    <=BE PortalSuspended
    <=BE ReadyForQuery(T)
    2000-01-01
    2000-01-02
    2000-01-03
    FE=> Execute(portal=C_3,limit=3)
    FE=> Sync
    <=BE DataRow
    <=BE DataRow
    <=BE DataRow
    <=BE PortalSuspended
    <=BE ReadyForQuery(T)
    2000-01-04
    2000-01-05
    2000-01-06
    FE=> Execute(portal=C_3,limit=3)
    FE=> Sync
    <=BE DataRow
    <=BE CommandStatus(SELECT)
    <=BE ReadyForQuery(T)
    2000-01-07
    A +

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

Discussions similaires

  1. Base de donnee access2003 pour gestion des stocks
    Par Eymins dans le forum Modélisation
    Réponses: 1
    Dernier message: 02/05/2010, 10h07
  2. gestion des images dans une base de données
    Par bkadje dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/10/2006, 11h12
  3. Base de données et gestion des droits...
    Par pelo68 dans le forum Oracle
    Réponses: 11
    Dernier message: 20/04/2006, 12h47
  4. Recherche logiciel de gestion de bases de données
    Par partyboy dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 22/11/2005, 17h30
  5. Probleme de gestion de base de donnees SQL
    Par Nonold dans le forum C++
    Réponses: 2
    Dernier message: 15/03/2005, 16h18

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