Bonjour,
Je rencontre un problème de dépassement de mémoire lorsque j'appel une procédure stockée qui dure 2-3 minutes : Ma servlet n'attend juste que le résultat.
Merci pour votre aide.
Cordialement,
Daniel
Bonjour,
Je rencontre un problème de dépassement de mémoire lorsque j'appel une procédure stockée qui dure 2-3 minutes : Ma servlet n'attend juste que le résultat.
Merci pour votre aide.
Cordialement,
Daniel
on peut avoir plus de détails? L'erreur se produit telle coté serveur sql ou dans ton application java? as-tu un stacktrace?
Tout d'abord la procédure stockée a été testée/validée sous MS SQL SERVER : En gros, elle marche.
Le problème étant que cette procédure stockée se réalise en 2/3 minutes et il semble qu'a ce moment précis la mémoire de l'application gonfle terriblement alors qu'elle ne devrait qu'attendre la fin de la procédure stockée.... et le pire étant que la mémoire n'est pas libéré : Je suis obligé de relancer le pc pour libérer la mémoire.
La procédure en question récupère en paramètre le chemin absolu du fichier de données chargé dans ma base de données.
PS : J'utilise le pool de connexion. Est-ce que le problème vient de là?
Ci-dessous le code d'appel à ma procédure:
Ci-dessous le stacktrace:
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 DiskFileUpload upload = new DiskFileUpload(); List items = upload.parseRequest(request); Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (!item.isFormField()) { File cFile = new File(item.getName()); File toSave = new File(getServletContext().getRealPath("/"), cFile.getName()); item.write(toSave); desc = toSave.getName(); filePath = toSave.getPath(); } } cS = cnx.prepareCall("{Call Read_File(?,?,?)}"); cS.setString(1, filePath); cS.setInt(2, idp);//Program id cS.setString(3, desc); cS.execute();
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 GRAVE: "Servlet.service()" pour la servlet Import a généré une exception java.lang.OutOfMemoryError: Java heap space at com.microsoft.sqlserver.jdbc.TDSPacket.<init>(Unknown Source) at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(Unknown Source) at com.microsoft.sqlserver.jdbc.TDSReader.readPacket(Unknown Source) at com.microsoft.sqlserver.jdbc.TDSReader.readResponse(Unknown Source) at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(Unknown Source) at com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(Unknown Source) at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:169) at com.mucoma.servlet.ImportManager.processRequest(Import.java:213) at com.mucoma.servlet.ImportManager.doPost(Import.java:290) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:595)
visiblement ton problème survient dans la lecture de la réponse. Quelle est la taille approximative des données renvoyées? Une jvm n'a accès qu'à une quantité limitée de mémoire par défaut. A toi d'augmenter la taille de mémoire dispo pour la jvm (paramètre -Xmx, exemple -Xmx 512M pour lui donner 512 mégas)
Pour ce qui est de ne 'pas libérer', la mémoire allouée à la jvm doit être libérée lorsque le process java.exe est arrêté. Donc ta nécessité de reboot est indépendante de la jvm.
Le fichier peut attendre 120 MO mais je ne comprends pas le problème puisque je ne transmet que le chemin absolue du fichier (String)
de toutes facons, le message est clair, ta jvm n'a pas assez de mémoire pour faire l'opération que tu demande -> faut augmenter la mémoire. Le fichier temporaire est créé sur le serveur SQL ou coté client? (le client dans le cas présent étant tomcat)
En faîte le fichier est déplacé sur un répertoire spécifique de l'application sous tomcat et je transmets donc directement le chemin à MS SQL SERVER pour le charger. Par exemple : D:\fichier.txt
Par ailleurs, je ne connais la démarche pour modifier l'espace mémoire
l'augmentation de la mémoire de ta jvm se fait via le parametre -Xmx, à ajouter à ton script de démarrage de tomcat ou à la variable d'environnement CATALINA_OPTS.
Merci mais pour autant je ne comprends pas le principe, s'agit t'il lors d'un chargement du fichier dans tomcat (Upload) que la jvm consomme ou bien lorsque je transmets bêtement le chemin absolu à ma procédure stockée?
De même, ne puis-je forcer java à ne plus pointer sur mon fichier pour libérer la mémoire? J'ai bien essayé =null mais rien ne se passe....
Merci pour cette aide
je crois, au vu du stacktrace, que t'arrive à cours de mémoire lors de la lecture de la réponse du serveur sql. Si, comme tu le dit, les données ont peu de volume dans la réponse, c'est juste que t'es à court de place, t'as pas assez des 64M de base du serveur tomcat -> on agrandit.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager