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

Hibernate Java Discussion :

Précisions à propos de la gestion des sessions


Sujet :

Hibernate Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 44
    Points : 28
    Points
    28
    Par défaut Précisions à propos de la gestion des sessions
    Bonjour,

    J'ai besoin d'un petit éclaircissement concernant SessionFactory et la gestion des sessions.
    Mon application tourne avec Struts et Hibernate sous une BDD Oracle, et jusqu'à maintenant à chaque fois que j'avais besoin d'accéder à la base je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Session connectionBDD = HibernateSessionFactory.getSession();
    Transaction tx = connectionBDD.beginTransaction();
    ...
    tx.commit();
    connectionBDD.disconnect();
    HibernateSessionFactory.closeSession();
    avec :

    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
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    public class HibernateSessionFactory {
     
        /** 
         * Location of hibernate.cfg.xml file.
         * Location should be on the classpath as Hibernate uses  
         * #resourceAsStream style lookup for its configuration file. 
         * The default classpath location of the hibernate config file is 
         * in the default package. Use #setConfigFile() to update 
         * the location of the configuration file for the current session.   
         */
        private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
        private  static Configuration configuration = new Configuration();
        private static org.hibernate.SessionFactory sessionFactory;
        private static String configFile = CONFIG_FILE_LOCATION;
     
    	static {
        	try {
    			configuration.configure(configFile);
    			sessionFactory = configuration.buildSessionFactory();
    		} catch (Exception e) {
    			System.err
    					.println("%%%% Error Creating SessionFactory %%%%");
    			e.printStackTrace();
    		}
        }
        private HibernateSessionFactory() {
        }
     
    	/**
         * Returns the ThreadLocal Session instance.  Lazy initialize
         * the <code>SessionFactory</code> if needed.
         *
         *  @return Session
         *  @throws HibernateException
         */
        public static Session getSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
     
    		if (session == null || !session.isOpen()) {
    			if (sessionFactory == null) {
    				rebuildSessionFactory();
    			}
    			session = (sessionFactory != null) ? sessionFactory.openSession()
    					: null;
    			threadLocal.set(session);
    		}
     
            return session;
        }
     
    	/**
         *  Rebuild hibernate session factory
         *
         */
    	public static void rebuildSessionFactory() {
    		try {
    			configuration.configure(configFile);
    			sessionFactory = configuration.buildSessionFactory();
    		} catch (Exception e) {
    			System.err
    					.println("%%%% Error Creating SessionFactory %%%%");
    			e.printStackTrace();
    		}
    	}
     
    	/**
         *  Close the single hibernate session instance.
         *
         *  @throws HibernateException
         */
        public static void closeSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
            threadLocal.set(null);
     
            if (session != null) {
                session.close();
            }
        }
     
    	/**
         *  return session factory
         *
         */
    	public static org.hibernate.SessionFactory getSessionFactory() {
    		return sessionFactory;
    	}
     
    }
    Je commence à douter de la façon dont je gère les sessions... enfin surtout comment je les ferme.
    Le truc c'est que du côté d'Oracle(en regardant avec TOAD les sessions actives et inactives connectées), même en ayant fermé les sessions côté java, j'ai toujours ma session en inactive.
    Je ne sais pas justement si ça vient de mon code ou s'il y a un paramètre sur Oracle qui garde les sessions inactives pendant un certain temps (mais alors assez long parce qu'elles restent plus de 2h facile, j'ai pas testé plus).

    Et aussi, session.disconnect() fait quoi exactement ? C'est utile de le mettre si on fait un .close() tout de suite après ?

  2. #2
    Membre actif Avatar de a.snaps
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 209
    Points : 241
    Points
    241
    Par défaut
    Je n'ai pas tout lu ton code, d'autant plus que je ne suis pas sûr de partager la stratégie... Mais soit.
    Il faut que tu comprennes qu'une Session peut être liée à une connexion JDBC à ta BDD, mais ce n'ai pas parce que tu fermes une session (ou même que tu en ouvre une d'ailleurs) que cela aura une impacte sur le nombre de connexion JDBC vers ta base... Si tu n'as rien configurer Hibernate utilise une pool de connexion par défaut si je ne m'abuse. Mais celle-ci n'est pas conseillée pour une utilisation en production. Je te conseille donc de jeter un coup d'oeil à ta configuration Hibernate et d'y intégrer une pool de connexion digne de ce nom...
    Alex

Discussions similaires

  1. Gestion des sessions avec applet
    Par Mister Nono dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 01/08/2006, 18h27
  2. [JSP] Gestion des sessions
    Par ze veritable farf dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 28/06/2006, 10h44
  3. [Struts][JSP]gestion des session en JSP
    Par zola dans le forum Struts 1
    Réponses: 6
    Dernier message: 27/04/2006, 16h23
  4. gestion des sessions
    Par jeff_! dans le forum Langage
    Réponses: 4
    Dernier message: 20/03/2006, 22h09
  5. [tomcat] gestion des sessions
    Par sebos63 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 12/10/2004, 14h25

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