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 :

Pb pour lire un grand nombre de données


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 52
    Points
    52
    Par défaut Pb pour lire un grand nombre de données
    Bonjour

    Je développe une application qui va lire dans une base de données Mysql une liste de produit chacun ayant plusieurs propriétés. tous le produit se trouvent dans une table, cette table contient a peu près 40 champs, et 14000 produits
    je créer un statement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Statement stmtArticleComplet;
    stmtArticleComplet=(Statement) con.createStatement();
    Puis je créer un ResultSet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      rsArticle_complet= (ResultSet) stmtArticleComplet.executeQuery(queryArticleComplet);
    avec queryArticleComplet qui est un requête SQL qui fonctionne tester plusieurs et sortie d'un programme en PHP utilisant cette requête.

    Enfin je place les données du Resultset dans un ARRAYLIST
    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
    ResultSetMetaData mdArticle= rsArticle_complet.getMetaData();
                    while (rsArticle_complet.next()) {
     
                        code_fournisseur.addElement(rsArticle_complet.getString("RefFabricant"));
     
                            for (int i=1 ; i<=mdArticle.getColumnCount() ; i++){
     
                               //Cela me sert pour décoder des chaînes de caractères en HTML        
                                        String html_article=
    StringEscapeUtils.unescapeHtml(rsArticle_complet.getString(i));
                                        article_complet.add(html_article);  //Article_complet est un ArrayList
     
                                        colonne.add(i+"."+mdArticle.getColumnLabel(i));
     
     
                                }
     
                            //System.out.println(article_complet);
                            }
    Alors dejà c'est long, et surtout j'ai cette erreur,
    IWAV0052E Invocation Target Exception creating connexions_virtuemart.connect_bdd
    java.lang.reflect.InvocationTargetException
    Caused by: java.lang.OutOfMemoryError: Java heap space
    je précise que si ma base de données est locale avec wamp par exemple ben c'est long au démarrage mais ça fonctionne bien, la même base de données mais a distance et j'ai l'erreur du dessus.
    Je ne sais pas quoi modifier ni même comment faire de plus si je modifie l'allocation mémoire de la JVM ben ça fonctionne mais je le fais dans Eclipse et je ne sais pas le faire pour un Jar exécutable.
    Si quelqu'un à une idée.
    Merci de votre attention

  2. #2
    Membre chevronné
    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 : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    question initiale (mais fondamentale): pourquoi as-tu besoin de 14000 articles en mémoire?
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  3. #3
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut
    Je rejoins la question de shadoko !
    Je suis curieux aussi de savoir aussi pourquoi tu souhaites garder 14000 objets avec 40 attributs chacun en mémoire, c'est assez gros !
    Pourrais-tu nous expliquer un peu plus ton besoin ?

    Ne pourrais-tu pas plutôt récupérer les articles dont tu as besoins pour travailler dessus ?

    Si tu as besoin de travailler sur de nouveaux articles, tu fais un nouvelle requête !

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    Ben je me doutes que je dois effectivement pouvoir le faire autrement sauf que je ne comprend pas, moi je veut que les personnes aient la liste de tous leur articles et quand elles cliquent dessus ben le prix, l'image si il y a des MP3 le dernier prix d'achats etc... soit visible donc je me suis dit je charge tous dans un tableau et je fais les traitements dessus, il faut bien qu'ils aient accès à tous leur produit, comment puis je faire autrement?
    Sinon je peut faire une requête qui permet d'afficher les articles dans la JTable quand on clique sur un produit ça exécute une nouvelle requête, mais j'ai l'impression que la connection est lente donc si je fais comme ça ben mon programme sera pas fluide du tout.
    Comment je pourrais faire autrement?
    Merci pour vos réponses

  5. #5
    Membre chevronné
    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 : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    excuses moi mais je n'ai pas précisément compris le comportement de ton application (+ j'ai du mal à croire que l'utilisateur ai besoin d'avoir autant de choses sous les yeux).
    Ceci dit on est probablement devant une problématique de cache: tu gardes en mémoire un certain nombre d'articles, tu renouvelles ce cache en anticipant (encore mieux si c'est asynchrone), etc.
    Le choix d'un article est-il "direct" (l'utilisateur pique selon sa fantaisie le 7678° article), ou est-ce linéaire (article suivant svp)?
    dans une interface graphique tu auras toujours N articles "visibles" et tu peux "peupler" la plage de ce qui est visible au fur et à mesure.
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  6. #6
    Membre chevronné
    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 : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    petite explication complémentaire:
    - tu "vois" 50 articles dans ton interface graphique
    - tu gardes en mémoire les 100 derniers articles consultés (les autres sont "poubellisés")
    - tu a les 50 articles suivants en réserve
    - tu es en train de charger en tâche de fond encore 50 articles
    petite complication: prévoir une navigation bi-directionnelle. mais bon ....
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    Bonjour

    Je précise quand même que je suis débutant en java, c'est un logiciel de gestion de magasin, je le fais pour moi pour m'entrainer, et un ami qui tiens un magasin m'a donné sa base de donnée, et il y a 14000 produits.
    Si un client vient au magasin acheter ou commander l'article 76881 ben le magasin doit le retrouver, moi j'ai mis une JTable avec un champ de recherche, et les 14000 produits, c'est peut être pas la bonne méthode, mais l'idée que dans l'interface graphique on puisse peupler au fur et à mesure, me plais bien mais je suis pas sur de comprendre, j'affiche les 100 premiers, par exemple, et il demande l'article 76881 qui n'est pas dans ces 100 produits afficher que ce passe t-il?
    Comment le magasin aura accès a cet article?
    J'ai tester de faire les requêtes que lorsque j'en ai besoin, et je n'ai plus l'erreur de la mémoire, ceci dit ce n'est pas très fluide (mais plus que ce que je pensais), peut tu m'en dire plus sur l'histoire de peupler au fur et à mesure stp
    merci encore pour vos réponses

  8. #8
    Membre éprouvé Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Points : 934
    Points
    934
    Par défaut
    en trois temps :

    1) l'utilisateur choisit une plage de noms, par exemple ceux qui commencent par "PAS" : il tape PAS dans un textfield,

    2) select nom from table where nom begins with textField.gettext() , et afficher la liste des noms

    3) l'utilisateur clique sur un article dans la liste des noms commençant par PAS, et select * from table where nom = listeSelectedItem

    (ajuster le texte des requêtes, bien sûr... )
    qu'en penses-tu ?

  9. #9
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut
    moi je veut que les personnes aient la liste de tous leur articles et quand elles cliquent dessus ben le prix, l'image si il y a des MP3 le dernier prix d'achats etc... soit visible donc je me suis dit je charge tous dans un tableau et je fais les traitements dessus, il faut bien qu'ils aient accès à tous leur produit, comment puis je faire autrement?
    Mets-toi à la place de l'utilisateur !
    Tu te vois avoir une liste de 14000 articles sous les yeux ? Tu saurais où chercher l'information que tu as besoin ? J'espère que t'as un bon scroll sur ta souris pour faire défiler !
    Nan sérieusement tu ne verras jamais une application avec autant de ligne affichée, ça n'a pas de sens et c'est juste indigeste et inbuvable !
    Moi je partirais sur un affichage par morceau comme l'a déjà proposé shadoko !

    mais l'idée que dans l'interface graphique on puisse peupler au fur et à mesure, me plais bien mais je suis pas sur de comprendre, j'affiche les 100 premiers, par exemple, et il demande l'article 76881 qui n'est pas dans ces 100 produits afficher que ce passe t-il?
    Ou les 50 ou 100 premiers comme tu le souhaites, mais 100, c'est beaucoup déjà ! Et pendant que ces 50 sont affichés, tu récupère les 50 suivants dans un thread en arrière plan, dès que tu les affiches, tu supprimes les anciens affichés et tu récupères en arrière plans les 50 suivants etc... Après tu peux garder les 50 suivants et 50 précédents si tu le souhaites...
    Et si l'utilisateur veut afficher le numéro 76881, (précis ton choix ! ) tu fais une nouvelle requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM articles WHERE id=76881;
    Après je vois pas trop comment il pourrait sélectionner le 76881 s'il en est entre les 150 et 200, donc je ne suis pas sûr de comprendre ton problème...

    Tu peux/dois aussi incorporer l'idée de la recherche comme le propose fraco qui je pense dans ton cas sera indispensable comme fonction, vu le nombre de résultats que tu as !

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    Ok je commence à comprendre, moi ça fonctionne les 14000 articles dans la JTable, il ne cherche jamais dedans mais en effectuant une recherche via un JTextField, ce qui me permet de faire un tri dans la JTable une sorte d'autocomplétion, enfin l'utilisateur écrit le début de l'article recherché et la recherche s'effectue en temps réel en rafraichissant la JTable je sais pas si j'arrive à me faire comprendre mais bref ce n'est qu'un effet visuel, mais ça reste tout de même intérressant car il peut trier la JTable en cliquant sur une colonne, et il à, par exemple, tout les produits d'une famille donnée, ou trier tout les produits par prix, ou ceux publier sur internet, en cliquant seulement sur la colonne prix ou publication.
    Alors si je comprend bien, je dois faire une requête pour chaque action de l'utilisateur, il clique sur la colonne prix, pour trier, moi je dois faire une requête qui va me cherche tout les produis trié en fonction de cette colonne.
    Je comprend qu'on peut pas afficher autant de produits, je vais revoir mon applis alors, car sinon il va y avoir des requêtes tout le temps, je vais essayer de la re penser, car visiblement ce serait plus propre.
    Merci pour tous ces conseils

  11. #11
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut
    Si j'ai bien compris, actuellement tu arrives à afficher certains articles, suivant ce que l'utilisateur tape dans la JTextField, en gros ce qu'avait proposé fraco.
    Par contre je suis pas sûr de comprendre la suite quand tu parles de trier en cliquant sur les colonnes, tu parles ranger par ordres alphabétiques ou par ordre croissant/décroissant ?
    Si oui, pourquoi veux-tu faire un nouvelle requête lorsque l'utilisateur clique sur la colonne ?
    Comme tu l'as dit, tu affiches les articles suivant ce qu'il tape dans la JTextField donc tu as déjà le/les article(s) dont tu as besoin au moment de cliquer sur tes colonnes non ?
    Ou alors je n'ai strictement rien compris !

    Quand tu dis que tu vas faire des requêtes tout le temps, moi j'ai envie de te répondre que tu seras obligé et que de toute façon, ça se passe comme ça !
    Si tu vas sur un site marchand, il t'affichera les résultats suivants ce que tu souhaites afficher et donc forcément des requêtes ! En aucun cas, il y a tout le contenu de leur base en mémoire !

    Après à toi d'optimiser au maximum, en gardant, pourquoi pas, les 20 dernières recherches ou alors l'idée des 100 articles en mémoire, jusqu'à l'optimisation des appels à la base, comme des prepared statement, éviter les SELECT * FROM... mais plutôt SELECT id, name etc. FROM..., éviter plusieurs petites requêtes à la suite et préférer en faire une seule un peu plus importante etc...

    Si l'exécutions de tes requêtes sont assez longues, mets les dans des threads pour éviter un blocage de l'application et pour plus de fluidité, vu que ça a l'air plutôt important pour toi.

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    Ok, éffectivement ce que propose Fraco est intérressant, je vais regarder ça de plus près, et faire comme vous dites je passe en résolu car je pense avoir eu assez de renseignement pour orienter mes recherches.
    Je l'ai déjà dit mais mieux vaut trop que pas assez merci encore pour votre aide

  13. #13
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut
    Pas de soucis !

    Bon développement !

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

Discussions similaires

  1. [2000] Meilleure méthode pour insérer un grand nombre de lignes
    Par nicodev24 dans le forum Développement
    Réponses: 11
    Dernier message: 31/10/2016, 11h25
  2. Stratégie pour afficher un grand nombre de données
    Par oneagaindoguys dans le forum Général Java
    Réponses: 50
    Dernier message: 09/12/2010, 10h22
  3. Requête pour modifier un grand nombre d'entrée
    Par gatsu00 dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/11/2007, 09h47
  4. créer une boulce pour lire dans une base de donnéé MySQL
    Par pierrot10 dans le forum Administration
    Réponses: 1
    Dernier message: 26/07/2006, 14h21
  5. Type PostgreSQL pour stocker des grands nombres
    Par K-Kaï dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 08/06/2006, 20h26

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