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

Servlets/JSP Java Discussion :

Eviter une même action sur plusieurs sessions (synchronized)


Sujet :

Servlets/JSP Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut Eviter une même action sur plusieurs sessions (synchronized)
    Bonjour,

    J'ai un écran qui contient diverses données.
    -on coche les lignes souhaitées
    -on crée un fichier Excel et on change enfin le statut des données puis on rafraîchit la page.

    Risque : 2 sessions peuvent tenter de faire la même demande avant le changement de statut des données (sinon la question ne se poserait pas, il suffirait de commencer à vérifier le statut en base)

    A] Une des solutions envisagées :
    Remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public ActionForward myAction
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public synchronized ActionForward myAction
    Question1 : là, j'ai pas tout compris donc je compte sur vous pour m'expliquer, mais on m'a dit que si je fais ça, non seulement j'empêche les autres sessions/utilisateurs de rentrer en même temps dans la fonction (ce qui résoud éventuellement mon potentiel problème d'accès concurrents même si c'est idiot de bloquer quand c'est des lignes différentes) mais je les empêche aussi d'exécuter n'importe quelle autre fonction de ma classe Action. On m'a parlé aussi de comportement différent entre Struts1 et Struts2.




    B]La solution qui vient d'être mise en place :
    Insérer en début de fonction un bloc synchronized
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    synchronized (syncCkecker) {
    //Traitements expliqués ci-dessous
    }
    qui va lire la liste mise dans le context de la servlet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Integer> servList = (List<Integer>)request.getSession().getServletContext().getAttribute("myList");
    On teste si la nouvelle liste demandée contient des éléments communs
    a)OUI --> erreur affichée sur la page
    b)NON -->on lui ajoute les éléments de la nouvelle liste demandée

    Puis la fonction continue ses traitements entourée par un try...catch...finally où dans le finally on purge la liste enregistrée dans le contexte de la servlet des ordres qu'on a ajouté au début.
    Question2 :Ca vous semble la meilleure solution?

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Ca doit donc être la meilleure solution

  3. #3
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Pourquoi ne pas créer le fichier EXCEL simplement en mémoire ?

    En effet, une servlet peut très bien renvoyer un fichier XLS dynamiquement sans que celui-ci ne soit créé physiquement sur le disque (ce qui est d'ailleurs une très mauvaise pratique)

    Ca t'éviterait tous ces problèmes de synchronisation.

    Enfin, si le XLS est très volumineux, tu peux songer éventuellement à le mettre en cache, partagé ou non, avec ehcache par exemple.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par fxrobin Voir le message
    Pourquoi ne pas créer le fichier EXCEL simplement en mémoire ?
    Pour être sûr de garder une trace de l'action notamment.

    Citation Envoyé par fxrobin Voir le message
    Ca t'éviterait tous ces problèmes de synchronisation.
    Pourquoi? Même "dynamiquement" il faut le temps de le construire et pendant ce temps on peut avoir une demande similaire en parallèle.

  5. #5
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Citation Envoyé par stof Voir le message
    Pourquoi? Même "dynamiquement" il faut le temps de le construire et pendant ce temps on peut avoir une demande similaire en parallèle.
    bah non parce que tu le construis dynamiquement pour 1 session utilisateur.
    La portée de la variable est soit "request" soit "session", donc pas de conflit entre utilisateurs.

    Pour l'avoir fait des dizaines de fois sur des projets qui génèrent des excels et des PDF accessibles "simultanément" c'est ce qu'il faut faire.

    Après si tu veux conservé ce qui a été généré, fais le après que la réponse ait été envoyée et fais le en synchronized si par hasard c'est le même nom de fichier ... mais encore une fois, c'est vraiment pas bien comme solution. Tu vas l'écrire où ton fichier ? dans la webapp ? très mauvaise idée, car en cas de re-déploiement / suppression de l'appli, tu perds aussi ton fichier.

    Au pire Si tu veux conserver pour de la traçabilité, conserve le flux en base de donnée avec un BLOB, où encore envoie le flux généré vers un serveur FTP ... mais surtout pas dans la webapp.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  6. #6
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    Citation Envoyé par stof Voir le message
    Pour être sûr de garder une trace de l'action notamment
    Trace ? quelle trace d'ailleurs ? avec ton système tu n'auras que le XLS généré par le dernier utilisateur : c'est pas vraiment une trace
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

Discussions similaires

  1. [DATA] Répéter une même opération sur plusieurs variables
    Par Elsa.b dans le forum SAS Base
    Réponses: 5
    Dernier message: 16/06/2015, 14h41
  2. Accès à une même table sur plusieurs schémas
    Par P3dr075 dans le forum PL/SQL
    Réponses: 1
    Dernier message: 04/05/2015, 12h26
  3. Exécuter une même requête sur plusieurs bases
    Par TristanL dans le forum Langage SQL
    Réponses: 9
    Dernier message: 20/06/2011, 09h49
  4. verification d'une même erreur sur plusieurs tables
    Par sousleau12 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/02/2009, 13h23
  5. Une même applet sur plusieurs pages
    Par suckthewindow dans le forum Applets
    Réponses: 6
    Dernier message: 20/08/2008, 16h36

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