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

Spring Java Discussion :

Ouverture d'une nouvelle session à chaque appel d'une méthode transactionnelle


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 138
    Par défaut Ouverture d'une nouvelle session à chaque appel d'une méthode transactionnelle
    j'ai moi aussi mis en place la gestion des transactions avec les annotations et quelque chose m'intrigue.

    j'ai une classe service, de mémoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Transactional
    ServiceImpl implements Service {
       public Set getFiles(){...};
       public Set getNotes(){...};
       public Set getUrls(){...};
       public Set getTodos(){...};
    }
    puis une servlet dans laquelle je fait appel aux méthodes de ma classe service, donc qq chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    doGet(HttpServletRequest request, HttpServletResponse response){
     
    getFiles();
    getNotes();
    getUrls();
    getTodos();
     
    }
    j'ai remarqué qu'à chaque appel d'une méthode get une session est ouverte puis refermé ce qui fait que j'ai une succession d'ouvertures et de fermetures de sessions. Ne connaissant pas très bien la gestion des transactions je me demande si c'est quelque chose de gênant. ça me parait pas terrible.
    Après quelques recherches j'ai trouvé le Open Session in View pattern qui ouvre une session pour toute la durée de la requête (la requete http prise en charge par la servlet) et la ferme à la fin. Je n'arrive pas à le mettre en place car je ne dispose pas d'une sessionFactory mais d'un transactionManager.
    Est-ce qu'il y a un moyen d'obtenir le même résultat par configuration du transactionManager?

    Merci pour toute aide, je suis à la recherche des meilleurs pratiques pour gérer les transactions dans une appli web

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Salut,
    Comment récupères tu le service dans la servlet ?

    Après quelques recherches j'ai trouvé le Open Session in View pattern qui ouvre une session pour toute la durée de la requête (la requete http prise en charge par la servlet) et la ferme à la fin. Je n'arrive pas à le mettre en place car je ne dispose pas d'une sessionFactory mais d'un transactionManager.
    Non, ça c'est autre chose, la session en question est une session de persistance, pas une session web et ça s'applique à JPA/Hibernate.

    [edit]
    Maintenant que j'y pense, tu ne serais pas en train de parler de session Hibernate ou JPA quand tu dis :
    j'ai remarqué qu'à chaque appel d'une méthode get une session est ouverte puis refermé

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 138
    Par défaut
    Merci pour ton retour djo.mos

    En fait oui je parle de session de persistance hibernate, j'ai expliqué comme un pied. J'utilise JPA + Hibernate.
    Je récupère le service par injection spring dans ma servlet.

    Qu'est ce que tu penses de la succession d'ouvertures et de fermetures de sessions de persistance? ça fait plusieurs jours que j'essaie d'avoir un avis sur la question sur le forum spring community mais sans succès.

  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bah je sais pas, t'as fait REQUIRES_NEW sur les annotations Transactional ? et quel est le scope de ton service ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 138
    Par défaut
    non pas de REQUIRES_NEW, juste @Transactional au dessus de la définition de ma classe.

    je ne comprends pas bien la question sur le scope. je défini le service comme un bean dans le fichier de configuration spring applicationContext.xml puis je l'injecte dans les différentes servlet de mon appli donc je dirais scope application.

    ma servlet ressemble à ça (j'ai pas le code sous les yeux):

    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
    class MyServlet extends HttpServlet{
     
        Service myservice;
     
        public void setMyService(Service service){
            myservice = service;
       }
     
     
      public void doGet(HttpServletRequest request, HttpServletResponse response){
     
               String id = request.getParameter("id");
     
               myservice.getFiles(Integer.parseInt(id));
               myservice.getNotes(Integer.parseInt(id));
               myservice.getUrls(Integer.parseInt(id));
               myservice.getTodos(Integer.parseInt(id));
     
      }
     
    }

    en fait j'ai un POJO comme 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
    @Entity
    class Technology{
     
        String id;
     
        @ManyToMany
        Set notes = new HashSet();
        @ManyToMany
        Set files = new HashSet();
        @ManyToMany
        Set todos = new HashSet();
        @ManyToMany
        Set urls= new HashSet();
     
       //tous les getters et setters
     
    }
    je suis en train de me demander si je ne devrais pas écrire ma servlet comme ceci pour seulement ouvrir une session de persistance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      public void doGet(HttpServletRequest request, HttpServletResponse response){
     
               String id = request.getParameter("id");
     
               Technology tech = myservice.getTechnology(Integer.parseInt(id));
     
               tech.getFiles();
               tech.getNotes();
               tech.getUrls();
               tech.getTodos();
     
      }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 138
    Par défaut
    personne pour m'aider

    ce week end je vais mesurer les performances entre :

    succession de open/close hibernate session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      public void doGet(HttpServletRequest request, HttpServletResponse response){
     
               String id = request.getParameter("id");
     
               myservice.getFiles(Integer.parseInt(id));
               myservice.getNotes(Integer.parseInt(id));
               myservice.getUrls(Integer.parseInt(id));
               myservice.getTodos(Integer.parseInt(id));
     
      }
    et

    1 seule session hibernate ouverte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      public void doGet(HttpServletRequest request, HttpServletResponse response){
     
               String id = request.getParameter("id");
     
               Technology tech = myservice.getTechnology(Integer.parseInt(id));
     
               tech.getFiles();
               tech.getNotes();
               tech.getUrls();
               tech.getTodos();
     
      }

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/07/2012, 23h24
  2. Réponses: 11
    Dernier message: 17/06/2008, 16h42
  3. forcer l'ouverture d'une nouvelle Session
    Par leo13 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 22/09/2007, 14h11
  4. [VBA Excel] Ouverture d'une nouvelle session Excel
    Par fmartin dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 12/06/2007, 15h35
  5. [Cookies] Chaque page démarre une nouvelle session
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 21/01/2006, 21h17

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