Bonjour tout le monde ,
Alors voila, j'ai un problème de fuite de mémoire que j'aimerai vous soumettre car je n'arrive pas à trouver la solution.
J'ai une application qui interagit avec une Base de données Microsoft SQL server.
J'ai une fonction du genre (j'ai un peu simplifié...):
Alors quelques précisions....
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 Object getName(int Val1, String Val2) { [...] synchronized(this) { String theQuery = new String("SELECT NAME FROM MY_TABLE WHERE VAL1 = ? AND VAL2 = ?"); try { // On construit la requête theQuery = theQuery.replaceFirst("[?]", "'" + Val1 + "'"); theQuery = theQuery.replaceFirst("[?]", "'" + Val2 + "'"); myStatement = cSqlDataBase.getConnection().createStatement(); try { myResultSet = myStatement.executeQuery(theQuery); } catch (Exception e) { [...] } theQuery = null; boolean resultNext = false; try { resultNext = myResultSet.next(); } catch (Exception e2) { [...] } if (resultNext) { [...] } finally { if (myResultSet != null) { myResultSet.close(); myResultSet = null; } } } catch (SQLException ex) { processException (ex); } catch(Exception e) { e.printStackTrace(Trace.getOut()); } finally { try { if (myResultSet != null) { myResultSet.close(); myResultSet = null; } myStatement.clearBatch(); myStatement.close(); myStatement = null; } catch (Exception e_ignore){} } } [...] }
les '?' sont remplacés par des paramètres de la fonction, ce qui permet de faire des requêtes sur des objets différents en BdD.
J'utilise JProfiler.
Lorsque j'exécute cette fonction, JProfiler m'indique j'ai n octets, en 1 allocation, alloués à la ligne
theQuery = theQuery.replaceFirst("[?]", "'" + Val2 + "'");
Si, j'exécute à nouveau ce code, JProfiler m'indique j'ai 2 x n octets, en 2 allocation, alloués à la ligne.
Si, j'exécute à nouveau ce code, JProfiler m'indique j'ai 3 x n octets, en 3 allocation, alloués à la ligne.
Et ainsi de suite...
Pour faire des tests, j'ai essayé de créer un theQuery 'en dur', et là, pas de fuite de mémoire.
Si je fais:
myResultSet = myStatement.executeQuery(new String(theQuery));
JProfiler m'indique que la fuite de mémoire est alors déplacée sur cette ligne.
Je pense donc que le problème est lié à la modification de la chaine passée à executeQuery... mais je n'arrive pas à trouver de solution pour éviter cette fuite de mémoire.
J'ai essayé plusieur driver JDBC (Microsoft, jTDS...) mais ça ne change rien.
Help......
Quelqu'un aurait-il une idée ??
D'avance merci
Partager