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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    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 : 42
    Localisation : Tunisie

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

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

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    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 confirmé
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    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
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  6. #6
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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.

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    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());
    		}

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 135
    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.

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    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 ?

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

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