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 :

[HSQLDB] Pb de gestion mémoire


Sujet :

JDBC Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 7
    Points
    7
    Par défaut [HSQLDB] Pb de gestion mémoire
    Bonjour,
    J'espère être au bon endroit pour évoquer mon problème ...

    Nous avons développez un site e-commerce avec HSQLDB et tout allait bien jusqu'à nous rencontrions des problèmes de lecture de données.
    Je m'explique ...
    Au lancement de l'application, une méthode lit l'ensemble des utilisateurs qui possède un compte. Cette liste est mise en mémoire (fonctionnement de HSQLDB) et utilisée par notre programme.
    Le problème c'est que la requete retourne 67 enregistrements mais que seulement 37 sont lus et disponibles !
    Voilà la méthode en question
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    private void readCustomers()
    	{
    		_customers = new HashMap<String,BOCustomer>();
    		_customersById = new HashMap<Long,BOCustomer>();
     
    		try
    		{
    			DBConnection conn = DBConnectionManager.getConnection();
    			Object[][]	 set  = conn.query(ALL_CUSTOMERS, null, ALL_CUSTOMERS_TYPES);
     
    			for(int i=0 ; i<set.length ; i++)
    			{
    				Long id = (Long)set[i][0];
    				String email = (String)set[i][3];
    				BOCustomer customer = new BOCustomer(id,
    						   							 (String)set[i][1],
    						   							 (String)set[i][2],
    						   							 email,
    						   							 (String)set[i][4],
    						   							 (Long)set[i][5],
    						   							 (String)set[i][6],
    						   							 (Long)set[i][7]);
    				_customers.put(email.toLowerCase(), customer);
    				_customersById.put(id, customer);
     
    				if(email.startsWith("OLD_"))
    				{
    					set = conn.query(GET_CUSTOMER_PWD, new Object[]{id}, GET_CUSTOMER_PWD_TYPES);
     
    					if(((Long)set[0][0]).longValue() == 0)
    					{
    						customer.unsubscribed();
    					}
    				}
    			}
     
    			conn.close();
    		}
    		catch(Exception e)
    		{
    			System.out.println(e);
    		}
    	}
    La requete est basique : select * from customer => 67 enregistrements.
    La boucle FOR doit donc effectuer 67 itérations, mais à 37, elle s'arrete et la HasMap _customers ne contient que 37 utilisateurs au lieu des 67 attendus

    C'est incompréhensible.
    J'ai augmenté la mémoire JAVA au démarrage (-Xmx=384M), le fichier .script ne fait que 350Ko, je ne comprends donc pas ce qui bloque ...

    Merci pour votre aide et je suis dispo pour tout clarification

  2. #2
    Membre actif Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Points : 277
    Points
    277
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _customers.put(email.toLowerCase(), customer);
    Se pourrait-il que quelques utilisateurs ont le même email, ce qui fait les entrées s'écrasent entre elles des fois .

    D'un autre côté, à la fin de l'itération combien contient l'autre map "customersById", si elle contient aussi 37, c'est que "set" pourrait ne contenir que 37 réellement !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par DarkMolo Voir le message
    Se pourrait-il que quelques utilisateurs ont le même email, ce qui fait les entrées s'écrasent entre elles des fois .
    Non, ce n'est pas possible en théorie, et après vérification, les 67 comptes ont bien des adresses différentes

    Citation Envoyé par DarkMolo Voir le message
    D'un autre côté, à la fin de l'itération combien contient l'autre map "customersById", si elle contient aussi 37, c'est que "set" pourrait ne contenir que 37 réellement !
    Elle contient bien également 37 éléments.
    En mode DEBUG ,avant le démarrage de la boucle for, set.length vaut bien 67.
    Arrivé à 37, ca sort de la boucle et en effet les 2 hashmaps sont à 37 éléments ...
    Je sèche

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Le problème viens du code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(email.startsWith("OLD_")) {
        set = conn.query(GET_CUSTOMER_PWD, new Object[]{id}, GET_CUSTOMER_PWD_TYPES);
       if(((Long)set[0][0]).longValue() == 0) {
          customer.unsubscribed();
       }
    }
    Il y a probablement un email qui commence par "OLD_" !
    Lorsque c'est le cas la variable set d'origine est écrasé par le résultat de la nouvelle requête !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    J'ai trouvé ...
    En fait, le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(email.startsWith("OLD_"))
    				{
    					set = conn.query(GET_CUSTOMER_PWD, new Object[]{id}, GET_CUSTOMER_PWD_TYPES);
     
    					if(((Long)set[0][0]).longValue() == 0)
    					{
    						customer.unsubscribed();
    					}
    				}
    réévalue le SET et sa longueur, du coup arrivé au 37ème, qui était la condition de ce if, et bien la longueur du SET passait à 1 et la boucle FOR se terminait ....

    La discussion est close ^^

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Alkhan Voir le message
    bonjour,

    Le problème viens du code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(email.startsWith("OLD_")) {
        set = conn.query(GET_CUSTOMER_PWD, new Object[]{id}, GET_CUSTOMER_PWD_TYPES);
       if(((Long)set[0][0]).longValue() == 0) {
          customer.unsubscribed();
       }
    }
    Il y a probablement un email qui commence par "OLD_" !
    Lorsque c'est le cas la variable set d'origine est écrasé par le résultat de la nouvelle requête !
    Exactement
    Merci

    Nos réponses se sont croisés ^^

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    de rien mais finalement la réponse a été trouvé sans ma réponse :p

    Il ne faut pas oublié de cliqué sur résolu en bas !!

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

Discussions similaires

  1. Thread POSIX et gestion mémoire
    Par pier* dans le forum POSIX
    Réponses: 1
    Dernier message: 07/07/2006, 21h36
  2. TAO, Value types et gestion mémoire
    Par TiChabin972 dans le forum CORBA
    Réponses: 1
    Dernier message: 25/04/2006, 20h55
  3. [D7] Tableau dynamique et Gestion mémoire
    Par Cl@udius dans le forum Langage
    Réponses: 7
    Dernier message: 13/03/2006, 15h16
  4. [Gestion mémoire] SetLength sur TDoubleDynArray
    Par MD Software dans le forum Langage
    Réponses: 14
    Dernier message: 24/04/2005, 21h11
  5. Gestion mémoire des Meshes (LPD3DXMESH)
    Par [Hideki] dans le forum DirectX
    Réponses: 1
    Dernier message: 08/07/2003, 20h34

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