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 :

Comment être sure de n'avoir qu'une seule session ?


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Inscrit en
    Février 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 17
    Par défaut Comment être sure de n'avoir qu'une seule session ?
    Bonjour,

    J'utilise hibernate pour mon application, et je n'arrive pas à avoir une seule session pour gérer mes données ... en effet, quand je fais une mise à jour d'une donnée, au niveau ihm, un coup je la vois bien, un coup je vois ma donnée avec son ancienne valeur ...

    Je suppose que j'ai deux sessions qui se baladent avec la même donnée, dans un état différent ...

    Comment puis-je garantir de n'avoir qu'une session ?

    Autrement dit qqun peut-il me fournir un algo pour accéder, et mettre à jour mes données qui marche ? Car je m'arrache les cheveux là ...

    Merci

  2. #2
    BsT
    BsT est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Par défaut
    C'est pour un projet pro ou perso ?

    As tu regardé tes transactions ?

    Sinon tente pool_size à 0 dans ton fichier de configuration Hibernate, si cela ne pose plus de problème, il faut configurer ton pool de connexion.

    Si rien ne marche donne nous plus d'information.

    Stéphane

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 152
    Par défaut
    Tu peux aussi utiliser un singleton comme unique moyen d'accéder à ton SGBD.

  4. #4
    Membre averti
    Inscrit en
    Février 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 17
    Par défaut
    Bonjour,

    Merci pour vos réponse, il s'agit effectivement d'un projet perso qui est déjà en prod
    Je n'utilisais que très peu la BDD jusqu'ici, mais maintenant j'en ai vraiment besoin et je galère
    J'ai tenté de mettre le pool_size à 0 mais ça n'a rien changé ...
    Cela dit, j'utilise la classe HibernateUtil qui crée une session unique ... enfin il me semblait car en débuggant j'ai constaté que j'avais plusieurs sessions qui se baladaient ...
    donc effectivement, elles ne contiennent pas toutes la même information :/
    voici mon code (enfin celui que j'ai pompé) :
    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
     
    public class HibernateUtils {
     
    	private static final SessionFactory sessionFactory;
     
    	static {
    		try {
    			Configuration conf = new Configuration();
    			conf = conf.configure();
    			// Crée la SessionFactory
    			sessionFactory =
    				conf.buildSessionFactory();
    		} catch (HibernateException ex) {
    			throw new RuntimeException("Problème de configuration : "
    					+ ex.getMessage(), ex);
    		}
    	}
     
    	public static ThreadLocal session;
     
    	public static Session currentSession()
    	throws HibernateException {
    		if (session == null) {
    			session = new ThreadLocal();
    		}
    		Session s = (Session) session.get();
    		// Ouvre une nouvelle Session, si ce Thread n'en a aucune
    		if (s == null) {
    			s = sessionFactory.openSession();
    			session.set(s);
    			System.out.println("CREATION SESSION !!!");
    		}
    		System.out.println(s);
    		System.out.println(s.hashCode());
    		return s;
    	}
     
    	public synchronized static void closeSession()
    	throws HibernateException {
    		Session s = (Session) session.get();
    		session.set(null);
    		if (s != null)
    			s.close();
    	}
    (avec qques sysout pour un debg rapide )

    puis le code utilisé pour accéder à la session, un exemple de récupération, un exemple de maj :

    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
     
    	public static List<Todo> get(User creator) {
    		List<Todo> todos = new ArrayList<Todo>();
    		Session session = null;
     
    		try {
    			session = HibernateUtils.currentSession();
    			session.beginTransaction();
    			todos = session.createQuery("from fr.lemfi.gilraen.metier.todo.Todo where creator='"+creator.getId()+"' or visibility='"+GlobalConstants.TODO_PUBLIC+"'").list();
    			session.getTransaction().commit();
    		} catch (Exception e) {
    			session.getTransaction().rollback();
                            logger.error(e);
    		}
    		return todos;
    	}
     
    	public static void updateTodo(Todo todo) {
     
    		Session session = null;		
    		try {
    			session = HibernateUtils.currentSession();
    			session.beginTransaction();
    			session.saveOrUpdate(todo);
    			session.getTransaction().commit();
     
    		} catch (Exception e) {
    			session.getTransaction().rollback();
                            logger.error(e);
    		}
    	}
    et puis pour être tout à fait complet : mon fichier de conf hibernate :
    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
     
    <?xml version='1.0' encoding='utf-8'?>
     
    <!DOCTYPE hibernate-configuration PUBLIC
    	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
     
     
    <hibernate-configuration>
     
    	<session-factory>
     
    		<!-- ********************** -->	
    		<!-- ***** properties ***** -->
    		<!-- ********************** -->
    		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
     
    		<property name="connection.url">jdbc:mysql://127.0.0.1:3306/gilraen?autoReconnect=true</property>
    		<property name="connection.username">user</property>
    		<property name="connection.password">pwd</property>
     
    		<property name="connection.pool_size">0</property>
    <!--		<property name="c3p0.min_size">1</property>
    		<property name="c3p0.max_size">10</property> -->
                    <property name="show_sql">true</property>
    		<property name="format_sql">true</property>
     
    	<!-- configuration pool via c3p0--> 
    		<property name="c3p0.acquire_increment">1</property> 
    		<property name="c3p0.idle_test_period">100</property> <!-- seconds --> 
    		<property name="c3p0.max_size">100</property> 
    		<property name="c3p0.max_statements">0</property> 
    		<property name="c3p0.min_size">10</property> 
    		<property name="c3p0.timeout">0</property> <!-- seconds --> 
    		<!-- ************************* -->
    		<!-- ***** Mapping files ***** -->
    		<!-- ************************* -->
    		<mapping resource="fr/lemfi/gilraen/dao/Todo.hbm.xml" />
     
    	</session-factory>
     
    </hibernate-configuration>
    Merci d'avance pour vos avis éclairés

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Par défaut
    Tu le sors d'où ton HibernateUtil ?

    Sinon, il faut que tu fermes ta session à un moment.
    Soit tu la fermes par exemple après ton rendu JSP dans le cas d'une application web, soit tu la fermes à la fin d'un traitement comme ton get, ou ton updateTodo.

  6. #6
    Membre averti
    Inscrit en
    Février 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 17
    Par défaut
    Le HibernateUtils est fourni dans pas mal de tutos ... bref, il semble effectivment que j'avais un problème de fermeture de sessions

    Je vais attendre d'avoir redéployé mon appli en prod pour passer le sujet à résolu, mais en local tout va mieux

    Merci !!!

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

Discussions similaires

  1. comment être sûr qu'un fichier est une image?
    Par tomy4ever dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 11/04/2007, 17h53
  2. [SQL] Comment être averti du coté admin d'une erreur du coté visiteur
    Par JackBeauregard dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 10/11/2006, 20h29
  3. Réponses: 8
    Dernier message: 27/09/2006, 13h52
  4. Réponses: 11
    Dernier message: 06/12/2005, 08h23
  5. Comment être sure que mon appli prenne le focus ?
    Par AmaX dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/12/2002, 15h00

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