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 :

Dépassement de mémoire lors d'un appel procédure stockée


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut Dépassement de mémoire lors d'un appel procédure stockée
    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

  2. #2
    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 807
    Points
    48 807
    Par défaut
    on peut avoir plus de détails? L'erreur se produit telle coté serveur sql ou dans ton application java? as-tu un stacktrace?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    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:
    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();
    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
    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)

  4. #4
    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 807
    Points
    48 807
    Par défaut
    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.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    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)

  6. #6
    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 807
    Points
    48 807
    Par défaut
    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)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    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

  8. #8
    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 807
    Points
    48 807
    Par défaut
    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.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 181
    Points : 69
    Points
    69
    Par défaut
    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

  10. #10
    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 807
    Points
    48 807
    Par défaut
    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.

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

Discussions similaires

  1. Appel Procédure stockée SQL qui plante
    Par Daniel MOREAU dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 05/04/2007, 08h55
  2. [PHP5]Appel procédure stockée
    Par maKyo dans le forum DB2
    Réponses: 2
    Dernier message: 02/03/2007, 11h04
  3. Réponses: 2
    Dernier message: 20/03/2006, 09h39
  4. Appeler Procédure stockée depuis ACCESS
    Par Sunny dans le forum Access
    Réponses: 2
    Dernier message: 13/09/2005, 22h07
  5. [PL/SQL] Appel procédure stockée dans trigger
    Par Félia dans le forum Oracle
    Réponses: 3
    Dernier message: 24/01/2005, 17h25

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