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 :

Problème de mémoire


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut Problème de mémoire
    Bonjour,

    J'ai un problème de mémoire avec mes connections SQL JDBC.

    Les premières exécutions du programme passent sans problème, jusqu'à la 10ème à peu près ou tout plante.

    Comme s'il y avait un problème de libération de mémoire.

    Voici mon code :

    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
     
    ConnectionSQL connection = new ConnectionSQL();
    		try {
    			connection.getconnect();
    			try {
    				ResultSet res = connection.getResult("SELECT * FROM ...;");
    				try {
    					while (res.next()) {
    						//traitement...
    					}
     
    				} finally {
    					res.close();
    				}
     
    			} finally {
    				try {
    					connection.finalize();
    				} catch (Throwable e) {
    					e.printStackTrace();
    				}
    			}
    		} catch (Exception e) {
    			String error = e.toString();
    			System.out.print(error);
    		}

    Et voici ma classe ConnectionSQL :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    public class ConnectionSQL {
     
    	protected boolean connectstatus;
    	protected Statement instruction;
    	protected Connection connexion;
    	protected ResultSet res;
    	protected String host = "...";
    	protected String user = "...";
    	protected String pwd = "...";
    	protected String driver = "com.mysql.jdbc.Driver";
     
     
    	public ConnectionSQL() {
     
    	}
     
     
    	public void finalize() throws Throwable {
    		if (this.res != null) {
    			try {
    				this.res.close();
    			} catch (SQLException sqlex) {
    				this.res = null;
    			}
    		}
    		if (this.instruction != null) {
    			try {
    				this.instruction.close();
    			} catch (SQLException sqlex) {
     
    			}
    			this.instruction = null;
    		}
    		if (this.connexion != null) {
    			try {
    				this.connexion.close();
    			} catch (SQLException sqlex) {
     
    			}
    			this.connexion = null;
    		}
     
    		super.finalize();
    	}
     
    	public Connection getconnect() {
    		connectstatus = false;
    		try {
    			Class.forName(driver).newInstance();
    			connexion = DriverManager.getConnection("jdbc:mysql://" + host + "/mabase",user,pwd);
    			this.connectstatus = true;
    		} catch (InstantiationException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    		try {
    			this.instruction = connexion.createStatement();
    		} catch (SQLException ex){
    			System.out.println(ex);
    		}
    		return connexion;
    	}
     
    	public ResultSet getResult(String query) {
    		if(connexion != null && instruction != null) {
    			try{
    				res = instruction.executeQuery(query);
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		return res;
    	}
     
    	public boolean executeQuery(String query) {
    		try {
    			instruction.executeUpdate(query);
    			return true;
    		} catch (SQLException e) {
    			e.printStackTrace();
    			return false;
    		}
     
    	}
     
    	public Statement getInstruction() {
    		return instruction;
    	}
     
    	public boolean getConnectstatus() {
    		return connectstatus;
    	}
    }

    Voyez vous un problème ?

    Merci.

  2. #2
    Membre éprouvé Avatar de anisj1m
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    1 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 067
    Points : 955
    Points
    955
    Par défaut
    est ce que tu peux nous donner votre log ?

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    C'est une mauvaise idée d'utiliser la méthode finalize pour libérer ses ressources (statement, connexion).
    On est jamais certain qu'elle soit appelée.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Je n'ai rien dans le log msqld.log.

    Voici le message d'erreur sur la console :

    HTTP JVM: JVMDUMP006I Processing dump event "systhrow", detail "java/lang/OutOfMemoryError" - please wait.
    HTTP JVM: JVMDUMP032I JVM requested Snap dump using '/local/notesdata/Snap.20110418.134808.2705.0001.trc' in response to an event
    HTTP JVM: JVMDUMP010I Snap dump written to /local/notesdata/Snap.20110418.134808.2705.0001.trc
    HTTP JVM: JVMDUMP032I JVM requested Heap dump using '/local/notesdata/heapdump.20110418.134808.2705.0002.phd' in response to an event
    HTTP JVM: JVMDUMP010I Heap dump written to /local/notesdata/heapdump.20110418.134808.2705.0002.phd
    HTTP JVM: JVMDUMP032I JVM requested Java dump using '/local/notesdata/javacore.20110418.134808.2705.0003.txt' in response to an event
    HTTP JVM: JVMDUMP010I Java dump written to /local/notesdata/javacore.20110418.134808.2705.0003.txt
    HTTP JVM: JVMDUMP013I Processed dump event "systhrow", detail "java/lang/OutOfMemoryError".
    HTTP JVM: Exception in thread "Thread-9"
    HTTP JVM: java.lang.OutOfMemoryError

    fr1man : D'apres toi c'est peut être le finalize qui n'est pas toujours appelé.

    Je vais tenter de faire mon appel SQL sans passer par ma classe SQLConnection pour voir si cela vient de sa.

    Merci. Je vous tiens au courant.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Tu charges beaucoup de choses en mémoire dans ta partie traitement ?

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    J'ai toujours le même problème sans utiliser de méthode finalize mais avec ceci :

    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
     
    try {
    			Class.forName(driver).newInstance();
    			Connection conn = DriverManager.getConnection("jdbc:mysql://" + host + "/mabase",user,pwd);
    			try {
    				Statement instruction = conn.createStatement();
    				try {
    					ResultSet res = instruction.executeQuery("SELECT * FROM ...;");
    					try {
    						while (res.next()) {
    							//traitement
    						}
     
    					} finally {
    						res.close();
    					}
    				} finally {
    					instruction.close();
    				}
    			} finally {
    				conn.close();
    			} 
    		}catch (Exception e) {
    			System.out.print(e.toString());
    		}

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    Dans la partie traitement, je récupère mes données de ma requete sql pour charger un StringBuffer et créer du code xml.
    Ce n'est pas très lourd.

    Ce qui est étrange c'est que tout fonctionne bien les 15 premiers lancements puis ça plante.

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Pas très étonnant, mais au moins c 'est plus propre.
    Tu fais quoi dans ta partie traitement que tu ne nous montres pas ?

  9. #9
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    appelz votre méthode "close" ou un truc du genre plutot que finalize, qui est un méthode qu'on ne devrait jamais appeler explicitement et qui n'est pas garantie d'etre appelée par la jvm.

    Ensuite, affichez vos exceptions plutot que de les cacher.

    Enfin, je pense aussi que c'est dans "traitement" que vous perdez votre mémoire.

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    Dans la partie traitement je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    result.append("<download download_id=\"");
    							result.append(res.getString("download_id"));
    							result.append("\" orderref=\"");
    							result.append(res.getString("orderref"));
    							result.append("\" date=\"");
    							result.append(res.getString("date"));
    							result.append("\" ipaddress=\"");
    							result.append(res.getString("ipaddress"));
    							result.append("\" filename=\"");
    							result.append(res.getString("filename"));
    							result.append("\" />");
    Puis je renvoi result à un PrintWriter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    out.println(result.toString());

  11. #11
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Et à chaque demande de connexion, tu recharges ton driver.
    C'est inutile.
    Enlève ta ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class.forName(driver).newInstance();
    Enfin si tu utilises un driver JDBC4.

    http://download.oracle.com/javase/tu...#drivermanager

  12. #12
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    En effet, il semble que cela vienne de ça.

    Mais lorsque je le retire, j'ai le message suivant sur la console :

    HTTP JVM: Error : java.sql.SQLException: No suitable driver

  13. #13
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Dans ce cas, il faut faire une fois et une seule, Class.forName(driver) et non pas à chaque demande de connexion.

  14. #14
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    Le problème c'est que je le fait une seule fois.

    En fait, j'ai un bouton. Sur ce bouton ma classe qui renvoi le code xml est appelée.

    C'est lorsque cette classe est appelée plusieurs fois que cela plante.

    Mais le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Class.forName(driver).newInstance();
    je suis obligé de le mettre dans ma classe.

  15. #15
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Quand je dis une seule fois, c'est une seule fois pour la durée de vie de ton application, pas une seule fois par click.
    Là, à chaque click tu charges ton driver.

  16. #16
    Membre éprouvé Avatar de anisj1m
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    1 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 067
    Points : 955
    Points
    955
    Par défaut
    par exemple tu peux charger le driver dans le constructeur de ta classe principale (classe jframe si tu developpe swing) et tu le met dans une variable statique et tout vos classe partage cette même connexion

  17. #17
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    En fait je doute que je puisse faire cela dans mon environnement. Mon projet est un projet domino, j'utilise java sous eclipse afin d'extraire une bibliothèque .jar que j’intègre dans mon projet domino.

    Cette bibliothèque contient des classes qui représentent des agents. Lorsque je clique sur un lien (je suis en web), alors l'agent se lance. Je n'est pas de classe principale.

  18. #18
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 084
    Points
    7 084
    Par défaut
    1. Inutile de faire
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Class.forName(...).newInstance()
      , juste suffi.
    2. Tu peux remplacer l'appel à par l'utilisation de la propriété système "jdbc.driver".

  19. #19
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    Points : 69
    Points
    69
    Par défaut
    Salut,

    J'ai testé sans le newInstance, mais c'est identique. J'ai tenté d'utiliser la propriété système jdbc.driver mais l’accès est refusé à mon agent.

  20. #20
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Le problème est de sortir Class.forName(...) de ta méthode pour que ce ne soit pas appliqué à chaque appel.
    Si tu es sur une architecture web, passe par un datasource que tu définis dans ton serveur d'application.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [WORD]Problème de mémoire
    Par Dnx dans le forum VBA Word
    Réponses: 17
    Dernier message: 05/10/2005, 14h48
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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