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 :

Lancement d'une application utilisant Hibernate avant que la base de données soit lancée.


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Lancement d'une application utilisant Hibernate avant que la base de données soit lancée.
    Bonjour,

    mon problème est le suivant:


    [Contexte]
    Utilisation d'Hibernate dans une application Java hébergée dans Tomcat.
    Base de données utilisée: MySQL.

    Fichier de configuration d'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
     
    <hibernate-configuration>
    	<session-factory>
     
            <!-- Use a Tomcat 5.5 JNDI datasource -->
    		<property name="connection.datasource">java:comp/env/jdbc/databaseResource</property>
    		<property name="show_sql">false</property>
    		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    		<property name="current_session_context_class">thread</property>
    		<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
     
    		.......
     
    	</session-factory>
    </hibernate-configuration>

    [Problème rencontré]
    Lorsque je lance mon application utilisant Hibernate avant que la base de données ne soit lancée des exceptions sont levées (ce qui est normal), mais une fois la base de données lancée il n'y a plus d'exception dans mes transactions mais les données ne sont pas correctement répliquées.
    Le lancement de mon application avant la base de données est une contrainte que je dois respecter.

    Si jamais le lance la bd avant mon application les données sont correctement répliquées.

    Le code que j'utilise pour initialiser hibernate est le suivant:

    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
     
    /**
         * Initialisation of the hibernate factory.
         * 
         * @param confUrl                        The url where the hibernate configuration can be found
         * @throws ExceptionInInitializerError    Exception thrown if there is an error in the initialisation of the factory
         */
        public HibernateUtil(URL confUrl) throws ExceptionInInitializerError{
     
     
            if ( sessionFactory == null ){
     
                    // Create the SessionFactory from hibernate.cfg.xml
                    sessionFactory = new Configuration().configure(confUrl)
                            .buildSessionFactory();
     
            }
     
        }
    Une exception est générée lors de l'exécution de la fonction buildSessionFactory(), et je la catche.

    Voici le contenu de cette exception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    09/04/2010 14:30:04,620 WARN  main             SettingsFactory:buildSettings() Could not obtain connection to query metadata
    org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Communications link failure due to underlying exception:
     
    ** BEGIN NESTED EXCEPTION **
     
    java.net.SocketException
    MESSAGE: java.net.ConnectException: Connection refused
    Ainsi mon application se lance malgré cette exception et j'initialise ensuite une session que j'utilise pour réaliser des transactions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    currentSession = HibernateUtil.getSessionFactory().openSession();
     
    //Persistance de mes objets
    ....
     
    //Utilisation de transactions
    La réalisation de ces différentes étapes me renvoie des erreurs tant que la base de données n'est pas lancée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    org.hibernate.exception.GenericJDBCException: Cannot open connection

    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    09/04/2010 14:30:15,646 WARN  satcom           JDBCExceptionReporter:logExceptions() SQL Error: 0, SQLState: null
    09/04/2010 14:30:15,647 ERROR satcom           JDBCExceptionReporter:logExceptions() Cannot create PoolableConnectionFactory (Communications link failure due to underlying exception:
     
    ** BEGIN NESTED EXCEPTION **
     
    java.net.SocketException
    MESSAGE: java.net.ConnectException: Connection refused
    Après avoir lancé la base de données il n'y a plus d'erreurs mais les données ne sont pas répliquées en base de données lors des transactions.

    J'aurais aimé savoir s'il existe un mécanisme de retry, en particulier au niveau de la fonction buildSessionFactory() ou si jamais vous avez vous même implémenté un mécanisme de retry afin de pouvoir lancer une application utilisant hibernate avant même de lancer la base de données et qu'elle se reprenne une fois la base de données lancée.


    Merci d'avance.


    Antoine

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 50
    Points : 48
    Points
    48
    Par défaut
    Alors des trucs j'en ai vu, mais ça...

    Il va falloir m'expliquer le pourquoi du "Le lancement de mon application avant la base de données est une contrainte que je dois respecter."

    Enfin bref, c'est évident que tu vas avoir des exceptions si ta base n'est pas démarée...

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Le fait que mon application puisse se lancer avant la base de données est une contrainte de robustesse imposée par mon client.

    Le fait que des exceptions soient levées est tout à fait normal, ce que je n'arrive pas à comprendre c'est pourquoi une fois la base de données présente je n'ai pas d'exceptions de levées mais que les données ne sont pas répliquées.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 50
    Points : 48
    Points
    48
    Par défaut
    Je vais faire un peu de hors sujet, mais ça m'intéresse quand même.

    Si la base est arrêtée régulièrement, cela signifie que ton application sera disponible seulement sur certains créneaux. Peux-tu me dire, brièvement, les tenants et aboutissants de ton client à faire quelque chose comme ça?

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    En fait l'application en question est lancée sur une machine spécifique d'un système différente de la machine hébergeant la base de données.

    L'ordre de démarrage des différentes machines du système fait que la machine hébergeant mon application sera démarrée avant la machine hébergeant la base de données.

    Il faut donc que mon application puisse démarrer avant la BD et fonctionner une fois cette dernière lancée.

    De plus en cas de coupure réseau ou éventuellement du serveur hébergeant la BD, il faut que l'application puisse se reprendre suite à ce genre d'événéments (ce qui est le cas).

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 86
    Points : 111
    Points
    111
    Par défaut
    Juste une solution un peu hors hibernate. C'est d'utiliser des mecanismes de synchronisation de threads qui se bloquent tant que la connextion n'est pas établie.
    Cela dit je pense que tu utilise un new thread à chaque connection n, peut etre que hibernate ne cherche pas à se reconnecter sur la base après que la première connection ait échoué!

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 50
    Points : 48
    Points
    48
    Par défaut
    Je serais du côté de sam, si la connexion échoue lors du démarrage du serveur, je ne suis pas sur qu'il puisse se reconnecter.
    En tout cas, d'après les différentes expériences que j'ai eues.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Points : 82
    Points
    82
    Par défaut
    En fait, tu peux effectuer une boucle jusqu'à temps que la connection soit établie et que tes données soient bien pris en compte par la base de donnée sans erreur.


    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
     
            public static final Logger log = Logger.getLogger(TestPanne.class);
     
    	public void saveObject(Object o){
    		boolean goodWork = false;
     
    		while( !goodWork ){
    			Transaction tx = null;
    			Session session = null;
    			try{
    				log.info("Hibernate connection");
    				//Config Hibernate
    				//Configuration cfg = new Configuration();
    				AnnotationConfiguration cfg = new AnnotationConfiguration();
    				SessionFactory sessionFactory = cfg.configure().buildSessionFactory();
    				session = sessionFactory.openSession();
    				tx = session.beginTransaction();
    				session.saveOrUpdate(o);
    				tx.commit();
    				goodWork = true;
    			}catch(HibernateException e){
    				log.warn(e,e);
    				if (tx != null) {
    					tx.rollback();
    				}
    				//on attend un peu
    				try {
    					Thread.sleep( 1000 );
    				} catch (InterruptedException e1) {
    					log.warn(e1);
    				}
    			}finally{
    				if( session != null ){
    					session.close();
    				}
    			}
    		}
     
    	}
    Comme tu ne sais pas quand est ce qu'elle est en ligne ou pas.
    Tu dois ajouter cette boucle contrairement à un cas classique où on sait par avance que la base de donnée est déjà lancée.
    Code Poet

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Points : 82
    Points
    82
    Par défaut
    Peut être qu'un jour , nous pourrons définir sur le SGBD un moyen de créer un évènement activable sur demande explicite de l'administrateur vers le client indiquant qu'elle est activée. Ainsi, on définit le nom du récepteur et son port avec login/pass et le SGBD envoi cette alerte vers le client avec un protocole standardisé
    Est ce que c'est un peu tirer par les cheveux ?
    Code Poet

  10. #10
    Candidat au Club
    Inscrit en
    Août 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut separation du server d'application et du server de base de données
    Bonjour ,
    je voudrais savoir s'il est possible de séparer le server d'application par exemple tomcat 5.5 et e server de bases de données interbase.
    je m'explique , j'ai deja developper une application JSF + hibernate + interbase comme base de donnees qui est en ce moment en production , mais ces temps ci j'ai remarqué des lenteurs. je voudrais donc deployer mon tomcat sur une machine N°1 et la base de donnee sur une autre machine N°2 mais en locale.
    j'ai modifier le fichier de configuration d'hibernate de sorte que la bases de données point sur la machine N°2.
    <property name="connection.url">jdbc:interbase://10.0.0.76/TEST.GDB</property>

    mais ca ne fonction pas si quelqu'un pourrait il m'aidé à trouvé une solution ?

Discussions similaires

  1. Lancement d'une application avant d'accéder à Windows
    Par benymypony dans le forum Windows
    Réponses: 4
    Dernier message: 10/08/2006, 20h58
  2. [Exécutable]lancement d'une application
    Par jesus144 dans le forum Général Java
    Réponses: 9
    Dernier message: 08/06/2005, 10h08
  3. [Plugin][MyEclipse]Lancement d'une application J2EE
    Par ujoodha dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 20/04/2005, 15h48
  4. Détecter le lancement d'une application
    Par Neilos dans le forum Windows
    Réponses: 8
    Dernier message: 22/11/2004, 12h32
  5. Lancement d'une application en local (!)
    Par Fifoun dans le forum MFC
    Réponses: 5
    Dernier message: 12/06/2004, 17h09

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